뱅크샐러드, gRPC 도입기: protobuf 단일 리포지토리와 grpc-gateway로 호환성 확보
핵심 내용
뱅크샐러드가 gRPC 도입 시 protobuf 단일 리포지토리 관리와 grpc-gateway를 통한 기존 서비스 호환성 확보 경험을 공유했다.
자세히 보기
gRPC 도입 배경과 protobuf의 역할
뱅크샐러드는 마이크로 서비스 환경에서 gRPC와 **Protocol Buffers(protobuf)**를 도입하며, 단순한 성능 향상보다 API 명세의 source of truth 확보에 중점을 두었다. 기존 REST API와 JSON 기반 통신에서 발생했던 문서 노후화 및 신뢰 상실 문제를 해결하기 위해, protobuf 파일을 기준으로 각 언어별 코드(Swift, Java, Go, Python 등)를 자동 생성하는 방식을 채택했다.
protobuf 단일 리포지토리(IDL) 전략
서비스별 분산된 protobuf 정의로 인한 파편화를 방지하고 협업 효율을 높이기 위해 모든 protobuf 파일을 하나의 idl 리포지토리로 통합했다. 이 리포지토리에는 원본 protobuf 파일뿐 아니라 protoc을 통해 변환된 Go, Java, Python, Swagger, Swift 파일(gen 폴더)까지 git에 포함해 관리한다. 이는 protoc 버전 차이로 인한 생성 결과물 불일치를 방지하고, CI 단계에서 lint 및 diff 테스트를 통해 잘못된 generate를 차단하기 위함이다.
기존 서비스와의 호환성 및 grpc-gateway 활용
새로운 gRPC 서비스와 기존 JSON 기반 REST API 서비스 간 호환성을 확보하기 위해 grpc-gateway를 도입했다. protobuf에 google/api/annotations.proto를 import하고 HTTP 메서드와 경로를 정의하는 option (google.api.http)을 추가하여, gRPC layer를 바라보는 HTTP layer를 구성했다. 이를 통해 기존 서비스는 변경 없이 JSON API로 gRPC 서비스를 호출할 수 있게 되었다.
Go 클라이언트 구현 및 테스트 전략
Go 서버가 기존 JSON 응답 서비스를 호출할 때는 jsonpb를 활용해 request/response를 protobuf message로 마샬링 및 언마샬링한다. 특히 AllowUnknownFields: true 옵션을 적용해 유연성을 확보했다. 테스트 시에는 net/http/httptest 모듈을 사용하여 mocking 없이 실제 HTTP 통신과 유사한 환경에서 에러 처리 및 응답 검증을 수행하며, gRPC 서비스 간 호출은 singleton 패턴으로 관리되는 client를 통해 간소화했다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.