liminfo

gRPC Reference

gRPC 프레임워크 레퍼런스

25개 결과

gRPC Reference 소개

gRPC 레퍼런스는 Protocol Buffers(proto3)와 Go gRPC 라이브러리를 사용하여 gRPC 서비스를 구축하기 위한 종합적이고 검색 가능한 가이드입니다. 여섯 가지 주요 영역을 다룹니다: Proto정의(syntax 선언, 메시지 타입, enum, oneof, map 필드), 서비스(service/rpc 정의, protoc 컴파일 명령어, grpc.NewServer()를 이용한 Go 서버 설정, grpc.Dial()을 이용한 클라이언트 연결), 메시지(google.protobuf.Timestamp를 포함한 필드 타입, repeated 필드, 중첩 메시지, google.protobuf.Any), 스트리밍(서버 스트리밍, 클라이언트 스트리밍, 양방향 스트리밍, stream.Send()/Recv() 연산), 인터셉터(UnaryServerInterceptor, StreamServerInterceptor, 인증 헤더를 위한 메타데이터 처리), 에러처리(status.Error(), 전체 gRPC 상태 코드 표, status.FromError(), 구조화된 에러를 위한 errdetails, deadline/timeout 패턴).

Go로 마이크로서비스를 구축하는 백엔드 엔지니어, 내부 RPC API를 설계하는 플랫폼 엔지니어, REST에서 gRPC로 마이그레이션하는 개발자가 주요 대상입니다. 레퍼런스는 Go 생태계를 기반으로 합니다: 모든 서버와 클라이언트 코드 예제는 google.golang.org/grpc 패키지, protoc-gen-go 및 protoc-gen-go-grpc 플러그인, context 기반 deadline, 로컬 개발을 위한 grpc.WithTransportCredentials(insecure.NewCredentials()) 같은 표준 패턴을 사용합니다. 로깅 및 인증을 위한 인터셉터 체인 같은 프로덕션 수준 패턴도 완전한 함수 시그니처와 함께 설명됩니다.

이 레퍼런스의 핵심 차별점은 네 가지 gRPC 통신 패턴을 한 곳에서 모두 다룬다는 점입니다: 단항 RPC(요청-응답), 서버 스트리밍(단일 요청, 스트림 응답), 클라이언트 스트리밍(스트림 요청, 단일 응답), 양방향 스트리밍(동시 요청/응답 스트림). 에러 처리 섹션에서는 숫자 값을 포함한 전체 gRPC 상태 코드(codes.OK부터 codes.Unauthenticated까지)와 에러 응답에 구조화된 필드 위반 정보를 첨부하기 위한 고급 errdetails 패키지도 다룹니다.

주요 기능

  • Proto3 문법: package 및 go_package 옵션을 포함한 syntax 선언, 필드 번호를 포함한 message 타입 정의, UNSPECIFIED 0값을 가진 enum, 상호 배타적 필드를 위한 oneof, map<key, value> 필드 타입
  • .proto SDL에서의 서비스 및 RPC 정의: 단항, 서버 스트리밍, 클라이언트 스트리밍, 양방향 스트리밍 RPC 시그니처
  • --go_out 및 --go-grpc_out 플래그, paths=source_relative 옵션을 포함한 protoc 컴파일 명령어
  • Go 서버 설정: net.Listen(), grpc.NewServer(), pb.RegisterXxxServer(), s.Serve(lis) — 완전한 서버 부트스트랩 패턴
  • Go 클라이언트 설정: 로컬 개발을 위한 insecure.NewCredentials()를 사용한 grpc.Dial(), 생성된 스텁에서 pb.NewXxxClient()
  • Go 구현과 함께 제공되는 네 가지 스트리밍 패턴: stream.Send(), stream.Recv(), 클라이언트 스트리밍을 위한 io.EOF 감지, 동시 양방향 Chat 예제
  • 인터셉터 패턴: 로깅/인증 미들웨어를 위한 (ctx, req, info, handler) 시그니처를 가진 UnaryServerInterceptor, StreamServerInterceptor, 헤더 추출을 위한 metadata.FromIncomingContext()
  • 숫자 코드를 포함한 완전한 gRPC 상태 코드 레퍼런스(OK, Cancelled, InvalidArgument, NotFound, AlreadyExists, PermissionDenied, Unauthenticated, Internal)와 필드 수준 유효성 검사 에러를 위한 errdetails.BadRequest

자주 묻는 질문

gRPC란 무엇이고 REST와 어떻게 다른가요?

gRPC는 HTTP/2 위에서 바이너리 직렬화를 위해 Protocol Buffers를 사용하는 고성능 RPC 프레임워크입니다. REST와 달리 .proto 파일에 정의된 강력한 타입 스키마를 가지며, 네 가지 통신 패턴(단항, 서버 스트리밍, 클라이언트 스트리밍, 양방향 스트리밍)을 지원하고 클라이언트/서버 코드를 자동으로 생성합니다. 서비스 간 통신에서 HTTP/1.1의 JSON보다 훨씬 빠릅니다.

proto3 필드 번호의 역할은 무엇인가요?

필드 번호(예: string id = 1;)는 필드 이름이 아닌 바이너리 와이어 포맷에서 필드를 식별하는 데 사용됩니다. 한번 배포된 스키마에서 사용된 필드 번호는 다른 필드에 재할당해서는 안 됩니다. 이를 어기면 기존 클라이언트와 서버의 바이너리 호환성이 깨집니다. 오래된 필드 번호를 폐기할 때는 reserved 키워드를 사용합니다.

서버 스트리밍과 양방향 스트리밍의 차이는 무엇인가요?

서버 스트리밍 RPC에서는 클라이언트가 단일 요청을 보내고 스트림 응답(예: 로그 라인 스트리밍)을 받습니다. 양방향 스트리밍에서는 클라이언트와 서버 모두 같은 연결 위에서 동시에 독립적으로 메시지를 보낼 수 있습니다(예: 채팅 또는 실시간 협업 편집). 두 방식 모두 .proto 정의에서 stream 키워드를 사용합니다.

gRPC 인터셉터는 어떻게 동작하나요?

인터셉터는 grpc.UnaryInterceptor() 또는 grpc.StreamInterceptor()로 grpc.NewServer()에 추가되는 미들웨어 함수입니다. UnaryServerInterceptor는 func(ctx, req, info, handler) (interface{}, error) 시그니처를 가지며 handler(ctx, req)를 호출하여 실제 RPC를 실행합니다. 인터셉터는 로깅, 인증 토큰 검증, 요청 제한, 트레이싱에 사용됩니다.

gRPC에서 인증 토큰을 어떻게 전송하나요?

HTTP 헤더처럼 동작하는 gRPC 메타데이터를 사용합니다. 클라이언트에서는 metadata.Pairs("authorization", "Bearer token123")로 메타데이터를 생성하고 metadata.NewOutgoingContext(ctx, md)로 context에 첨부합니다. 서버에서는 인터셉터나 리졸버 내부에서 metadata.FromIncomingContext(ctx)로 추출하여 토큰을 검증합니다.

다양한 에러 시나리오에서 어떤 gRPC 상태 코드를 사용해야 하나요?

요청한 리소스가 존재하지 않으면 codes.NotFound(5), 잘못된 입력 형식에는 codes.InvalidArgument(3), 인증은 됐지만 접근 권한이 없으면 codes.PermissionDenied(7), 유효한 자격증명이 없으면 codes.Unauthenticated(16), 중복 생성 시도에는 codes.AlreadyExists(6), 예상치 못한 서버 측 오류에는 codes.Internal(13)을 사용합니다.

gRPC에서 요청 타임아웃을 설정하는 방법은?

context.WithTimeout(context.Background(), 5*time.Second)으로 deadline이 있는 context를 생성하고 클라이언트 호출에 전달합니다. deadline을 초과하면 클라이언트는 codes.DeadlineExceeded 에러를 받습니다. 항상 defer cancel()로 리소스를 해제하세요. 서버에서도 ctx.Err()를 확인하여 클라이언트가 일찍 취소했는지 감지할 수 있습니다.

protoc는 .proto 파일에서 어떻게 Go 코드를 생성하나요?

--go_out 및 --go-grpc_out 플래그로 출력 디렉터리를 지정하고, --go_opt=paths=source_relative와 --go-grpc_opt=paths=source_relative를 추가하여 디렉터리 구조를 유지하고, .proto 파일 경로를 지정하여 protoc를 실행합니다. 이렇게 하면 메시지 타입이 포함된 .pb.go 파일과 서버 인터페이스 및 클라이언트 스텁이 포함된 _grpc.pb.go 파일 두 개가 생성됩니다.