정지용
기술스택 목록
백엔드

gRPC

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

프로토콜 버퍼 기반으로 서비스 간 함수 호출을 정의하고 실행하는 원격 프로시저 호출 프레임워크

gRPC는 서로 다른 프로세스나 서버에 있는 함수를 마치 로컬 함수처럼 호출할 수 있게 해주는 RPC 프레임워크다. 서비스의 인터페이스와 메시지 구조를 Protocol Buffers로 미리 정의하고, 이를 바탕으로 여러 언어용 클라이언트/서버 코드를 자동 생성해 사용한다. HTTP/2 위에서 동작해 하나의 연결로 다수의 요청과 응답을 동시에 주고받을 수 있고, 텍스트 기반 API보다 적은 오버헤드로 빠르고 일관된 통신을 하도록 설계됐다. 특히 서비스 간 통신이 잦고 지연시간이 민감한 시스템에서 REST/JSON의 대안으로 자주 쓰인다.

이럴 때 사용합니다

  • 서비스 간 호출 빈도가 높고 지연시간에 민감한 내부 시스템을 구축할 때
  • 여러 언어로 작성된 서비스 사이에 타입이 명확한 계약을 강제하고 싶을 때
  • 요청-응답 외에 지속적인 데이터 스트림(센서, 제어 신호 등)을 주고받아야 할 때
  • REST/JSON보다 작은 페이로드와 빠른 직렬화가 필요한 고빈도 통신 상황일 때

핵심 개념

Protocol Buffers (Protobuf)
gRPC가 사용하는 IDL(인터페이스 정의 언어)이자 바이너리 직렬화 포맷으로, .proto 파일에 메시지와 서비스 구조를 정의한다.
Service Definition
.proto 파일에서 호출 가능한 메서드와 입출력 메시지 타입을 명시한 것으로, 이를 기반으로 서버·클라이언트 스텁 코드가 생성된다.
Code Generation (stub)
protoc 컴파일러가 .proto 정의로부터 각 언어별 클라이언트/서버 코드를 자동 생성해, 개발자는 원격 호출을 로컬 함수 호출처럼 사용할 수 있다.
Streaming RPC
단발성 요청-응답 외에 클라이언트/서버/양방향 스트리밍을 지원해, 연속적인 데이터 흐름을 하나의 연결로 주고받을 수 있다.
HTTP/2 Transport
gRPC는 HTTP/2를 전송 계층으로 사용해 멀티플렉싱, 헤더 압축 등을 통해 낮은 지연과 높은 처리량을 얻는다.

간단한 gRPC 서비스 정의

로봇에 이동 명령을 스트리밍으로 전송하는 gRPC 서비스와 메시지 구조를 .proto 파일로 정의한 예시다.

예시
syntax = "proto3";

service RobotControl {
  // 클라이언트가 명령을 계속 보내는 스트리밍 RPC
  rpc SendCommand (stream CommandRequest) returns (CommandAck);
}

message CommandRequest {
  double velocity_x = 1;
  double velocity_y = 2;
  int64 timestamp_ms = 3;
}

message CommandAck {
  bool received = 1;
}

처음 쓸 때 흔한 함정

  • proto 파일을 수정하면 관련된 모든 서비스의 코드를 다시 생성하고 배포해야 한다
  • 브라우저에서 직접 호출할 수 없어 웹 클라이언트는 별도의 gRPC-Web 게이트웨이가 필요하다
  • 메시지가 바이너리라 사람이 읽기 어려워 디버깅 시 별도 도구가 필요하다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.