cd ../
Network·2026-02-02·4 min read·# entry/014

gRPC(Google RPC): REST를 넘어선 초고성능 통신 프레임워크

구글이 마이크로서비스를 위해 개발한 gRPC. HTTP/2와 Protocol Buffers를 통해 어떻게 압도적인 성능을 내는지, 그리고 REST API와는 무엇이 다른지 분석합니다.

**gRPC(google Remote Procedure Call)**는 구글이 개발하여 2015년에 오픈소스로 공개한 고성능 RPC 프레임워크입니다.

1. 탄생 배경과 철학

구글 내부에는 마이크로서비스 간의 방대한 통신을 처리하기 위해 10년 넘게 사용해 온 Stubby라는 시스템이 존재했습니다. gRPC는 이 Stubby를 바탕으로 범용성을 갖추어 재설계된 차세대 통신 규약입니다.

핵심 철학

"네트워크 너머에 있는 서버의 함수를, 마치 내 로컬 객체의 메서드처럼 호출하자." 개발자는 네트워크 통신의 복잡함(직렬화, 소켓 연결 등)을 몰라도 됩니다. 그냥 함수를 호출하면 알아서 다 됩니다.


2. gRPC가 압도적으로 빠른 3가지 이유

gRPC는 단순한 라이브러리가 아니라, 통신 계층부터 데이터 형식까지 모든 것을 최적화했습니다.

① 전송 계층: HTTP/2의 힘

REST API가 주로 사용하는 HTTP/1.1과 달리, gRPC는 HTTP/2를 기본으로 사용합니다.

  • 멀티플렉싱 (Multiplexing): 하나의 TCP 커넥션에서 여러 개의 요청과 응답을 동시에 주고받아 대기 시간(Head-of-Line Blocking)을 획기적으로 줄입니다.
  • 헤더 압축 (HPACK): 무거운 헤더 정보를 압축하여 네트워크 대역폭 낭비를 최소화합니다.
  • 양방향 스트리밍: 클라이언트와 서버가 실시간으로 데이터를 주고받는 연결 지향적 통신이 가능합니다.

② 데이터 형식: Protocol Buffers (Protobuf)

텍스트(JSON)가 아닌 바이너리(Binary) 형식의 데이터 직렬화 방식을 사용합니다.

사람이 읽을 수 있는 텍스트 형식입니다.

{
  "name": "Seungwon",
  "id": 1234
}
  • 단점: 중괄호, 키 값("name") 등 메타 데이터가 많아 용량이 크고, 파싱 할 때 CPU가 텍스트를 일일이 해석해야 합니다.

③ 통신 메커니즘: IDL과 코드 생성

gRPC 개발의 중심에는 .proto라는 IDL(Interface Definition Language) 파일이 있습니다.

1

1. 계약 (Define)

.proto 파일에 서비스와 주고받을 데이터 구조(메시지)를 정의합니다. 이것이 서버와 클라이언트 간의 불변의 계약서가 됩니다.

2

2. 컴파일 (Compile)

이 파일을 protoc 컴파일러에 넣으면, 각 언어(Java, Python, Go 등)에 맞는 Stub(대리자) 코드가 자동 생성됩니다.

3

3. 타입 안정성 (Safety)

개발자는 생성된 코드를 가져다 쓰기만 하면 됩니다. 필드명을 오타 내거나 잘못된 타입을 넣으면 컴파일 타임에 에러가 발생하여 버그를 원천 차단합니다.


3. REST API vs gRPC 비교

비교 항목REST APIgRPC
기반 프로토콜HTTP/1.1 (주로)HTTP/2
데이터 형식JSON (Text)Protobuf (Binary)
가독성좋음 (사람이 읽기 쉬움)나쁨 (별도 도구 필요)
결합도낮음 (유연한 소통)높음 (엄격한 규약)
성능보통매우 높음
주요 용도외부 공개용 API (Open API), 웹내부망 서버 간 통신 (MSA)

4. 결론: 언제 써야 할까?

gRPC는 REST API의 자유로움을 포기하는 대신, 성능과 안정성을 얻는 선택입니다.

gRPC의 가치
  • 타입 안정성: 설계도가 강제되기 때문에, 서버 API가 변경되었을 때 클라이언트 코드가 깨지는 것을 빌드 시점에 잡아냅니다. * 비용 절감: 바이너리 통신을 통해 서버의 CPU 사용량과 네트워크 트래픽 비용을 수억 원 단위로 절감할 수 있습니다. (대규모 트래픽 환경)
고려할 점
  • 브라우저 호환성: 웹 브라우저는 gRPC를 직접 지원하지 않아 gRPC-Web 같은 프록시가 필요합니다. * 디버깅 난이도: 데이터가 바이너리로 날아가기 때문에 와이어샤크(Wireshark) 같은 별도 도구 없이는 눈으로 값을 확인하기 어렵습니다.