gRPC 필드누락 문제 해결 기록

ddoachi·2025년 4월 18일

TekaPicker

목록 보기
5/30

문제 요약

  • user.proto에서 nickname 필드를 정의했으나, Nest.js gRPC 서버에서 해당 필드가 계속 누락되어 들어왔음
  • grpcurlBloomRPC로 요청해도 nickname이 서버에 전달되지 않았음
  • 원인은 Nest.js가 참조하는 proto 파일이 잘못된 경로(dist/ 내부)였기 때문임

최종 해결 방법 요약

  1. user.proto에서 optional string nickname = 3; 명시
  2. ts-proto 명령에서 아래 옵션 사용:
    --ts_proto_opt=nestJs=true,outputServices=grpc-js,useOptionals=messages,env=node,addGrpcMetadata=true
    --experimental_allow_proto3_optional
  3. protoPathdist 내 경로가 아닌 원본 proto 절대경로로 지정:
    import { resolve } from 'path';
    const PROTO_PATH = resolve(__dirname, '../../../../../proto/user.proto');

grpcurl 설치 및 사용법

설치

(1) Mac (Homebrew)

brew install grpcurl

(2) Linux / Windows

GitHub Release에서 다운로드:
https://github.com/fullstorydev/grpcurl/releases

기본 사용법

grpcurl -plaintext localhost:50051 list

서비스 목록 확인

grpcurl -plaintext -proto ./proto/user.proto -d '{"email":"test@test.com","password":"1234","nickname":"tester"}' localhost:50051 user.UserService.SignUp

삽질 로그

  • proto에 optional 지정했는데도 서버에 nickname이 안 옴
  • ts-proto에서 optional을 인식하게 하려면 --experimental_allow_proto3_optional 꼭 넣어야 함
  • useOptionals=true 대신 useOptionals=messages 로 업데이트 필요함
  • protoPath가 dist를 참조하고 있어서 Nest.js 서버가 잘못된 proto 정의로 메시지 파싱함
  • __dirname 기준 경로 잘못 이해하고 있었음 → resolve(process.cwd(), 'proto/user.proto') 또는 절대경로로 수정
  • 수정 후 nickname 잘 들어옴

결론

  • gRPC optional 필드는 의외로 서버에서 쉽게 누락될 수 있음
  • protoPath의 경로가 원본을 제대로 가리키고 있는지 항상 확인할 것
  • grpcurl은 proto를 직접 지정해주는 게 가장 안전함
profile
내일도 풀스택

0개의 댓글