gRPC 사용시 IntelliJ IDEA에서 Google Common Protos 의존성 Unresolved 문제 해결하기
문제 배경
Gradle을 빌드 툴로 사용하는 gRPC 프로젝트를 개발 중에 아주 짜증나는 문제를 만났던 경험을 기록하고자 합니다.(하지만 알고보니 별 것 아니었던..!!🤬)
먼저 저희 프로젝트는 다음과 같은 구조로 되어 있습니다. (중요한 내용은 아닙니다.)
:shared:protos
모듈: .proto 파일만 정의:shared:stub
모듈: 정의된 .proto 파일을 기반으로 실제 코드 생성
이 구조에서 google-common-protos
의존성을 사용하여 google/type/date.proto
와 같은 Google에서 제공하는 공통 Protocol Buffer 정의를 사용하고 있었습니다.
문제 상황
위 이미지와 같이 proto 파일에서 Google 공통 proto를 import할 때 IntelliJ IDEA에서 unresolved로 표시되는 문제가 발생했습니다.
사실 코드 생성이나 빌드에는 전혀 문제가 없었지만, IDE가 import를 인식하지 못해 다음과 같은 불편함이 있었습니다.
- import 문에 빨간 밑줄(unresolved) 표시
- 자동완성 기능 사용 불가
- 코드 네비게이션 불가
또 외부 lib 참조에는 멀쩡히 보이는 proto파일을 인식하지 못하니 더욱 답답하게만 느껴졌습니다.
StackOverFlow를 뒤져보았으나, google-common-proto의 proto를 다운로드 받아서 직접 제 프로젝트에 포함시키라는 내용 뿐 이었습니다.
물론 그렇게 하면 바로 해결이야 됐겠지만, 그러면 빌드 툴을 통해 외부 라이브러리에 의존성을 설정하는 의미가 퇴색되고, 이미 플러그인에 의해 라이브러리에 포함된 proto의 stub들을 생성하고 있는데, 라이브러리와 중복되는 proto를 프로젝트에 직접 포함시킬 경우의 문제도 고려해야 했습니다.
해결 방법
이 문제는 IntelliJ IDEA의 Protocol Buffer 플러그인 설정에서 import 경로를 추가하여 해결할 수 있었습니다.
해결 과정
1. IntelliJ IDEA의 설정(Settings)으로 이동합니다.
2. Languages & Frameworks > Protocol Buffers로 이동합니다.
3. Import 경로 설정에 google-common-protos의 proto들이 위치하는 경로를 추가합니다.
* google-common-protos에 의존성을 가지고 gradle protobuf 플러그인을 사용하면, extractIncludeProto태스크를 통해 build 하위에 proto들이 아래와 같이 추출되게 됩니다.
* 때문에 결론적으로 path/build/extracted-include-protos 경로를 잡아주면 됩니다.
4. 설정 변경이 적용되지 않으면 IDE를 재시작 해줍니다. (보통 한 번에 잘 됩니다.)
결과
위 설정을 적용한 후, 모든 import 문제가 해결되었습니다
- 빨간 밑줄 사라짐
- 자동완성 기능 정상 작동
- 코드 네비게이션 가능 (Ctrl+클릭으로 정의로 이동 가능)
결론
이 문제는 실제 빌드나 코드 생성에는 영향을 미치지 않았지만, 개발 경험과 생산성에 영향을 끼칠 수 있는 문제였습니다. (= 짜증나고 거슬리는 문제ㅋㅋ)
IntelliJ IDEA의 Protocol Buffer 플러그인 설정에서 간단히 import 경로를 추가하는 것만으로 문제를 해결할 수 있었습니다.
이 방법은 다음과 같은 경우에 유용합니다.
- Gradle/Maven 의존성으로 Protocol Buffer 파일을 사용하는 경우
- 멀티 모듈 프로젝트에서 다른 모듈의 proto 파일을 참조하는 경우
- 외부 라이브러리의 proto 파일을 import하는 경우
Outro
.... IDE 플러그인 설정만 바꿔주면 되는 문제를 그레이들 빌드 태스크를 작성했다 지웠다, 오만가지 삽질 후에 발견했네요.
뭔가 허탈하기도 하고, 바보같이 삽질한 제 자신이 짜증나기도 했습니닼ㅋㅋㅋ
아무튼 gRPC가 REST만큼 자주쓰이는 API 방식은 아니지만 누군가에게는 도움이 될까 싶기도 하고, 저도 더 잘 기억하기 위해 포스팅으로 남겨봤습니다!