gRPC란 무엇인가?

gRPC에 대한 개념에 설명한다.

gRPC란?

gRPC는 Google에서 개발한 고성능, 범용 오픈소스 RPC(Remote Procedure Call) 프레임워크로, 서로 다른 서비스 간의 통신을 빠르고 효율적으로 수행하기 위해 만들어진 기술이다.

gRPC는 “네트워크 너머에 있는 함수를, 마치 내 코드 안의 함수처럼 호출할 수 있게 해주는 기술"이다. 즉, 서비스 간에 **원격 함수를 호출하는 방식(RPC)**을 표준화하고, 빠르고 타입 안전한 통신을 가능하게 한다.

전통적인 REST 기반 통신이 주로 HTTP/1.1과 JSON을 사용하여 데이터를 주고받는 것과 달리, gRPC는 HTTP/2 프로토콜과 **Protocol Buffers(ProtoBuf)**라는 이진 직렬화 포맷을 기반으로 한다. 이러한 기술적 특성 덕분에 gRPC는 낮은 지연 시간, 높은 처리량, 경량의 메시지 크기로 빠르고 효율적인 통신을 할 수 있다.

또한 gRPC는 서비스 간 API를 .proto 파일로 명세함으로써, 서버와 클라이언트가 동일한 인터페이스 정의를 공유하도록 하며, 여러 프로그래밍 언어에 대한 자동 Stub 생성을 지원한다. 이러한 구조는 다중 언어 환경에서의 개발을 용이하게 하고, 서비스 경계를 명확히 하여 유지보수성을 크게 향상시킨다.

22 출처: https://appmaster.io/ko/blog/grpcneun-mueosibnigga

gRPC의 핵심 요소

1. Protocol Buffers(프로토콜 버퍼) 기반

gRPC는 JSON 대신 **프로토콜 버퍼(ProtoBuf)**라는 바이너리 포맷을 사용한다.

  • JSON보다 작고 빠름
  • 명확한 스키마(protobuf 파일) 기반
  • 각 언어로 자동으로 Stub 코드(클라이언트/서버 코드) 생성

예: hello.proto

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

2. HTTP/2 기반 통신

gRPC는 내부적으로 HTTP/2 프로토콜을 사용합니다.

그래서 다음이 가능합니다:

  • Multiplexing (하나의 연결로 여러 요청)
  • Server Push
  • 헤더 압축
  • 스트리밍(양방향 포함)

즉, REST보다 더 빠르고 효율적인 구조입니다.

gRPC 통신 방식 (4가지)

유형 설명
Unary 가장 기본적인 1요청 → 1응답
Server Streaming 서버가 여러 메시지를 스트림으로 전달
Client Streaming 클라이언트가 여러 메시지를 보내서 서버가 한 번 응답
Bidirectional Streaming 클라이언트와 서버가 동시에 여러 메시지를 주고받음

예: 채팅, 실시간 로그 처리, 스트리밍 데이터 처리에 적합

gRPC의 장단점

장점

  • 빠르고 가벼운 통신
    • 프로토콜 버퍼 + HTTP/2 조합으로 매우 고성능.
  • 강력한 타입 안정성
    • proto 스키마 기반으로 컴파일 시 오류 확인 가능.
  • 멀티언어 지원
    • Go, Java, Kotlin, Python, Rust, C#, Node, Ruby 등 대부분의 언어에서 사용 가능.
  • 스트리밍 지원
    • REST에서는 어렵거나 번거로운 양방향 스트리밍을 기본으로 지원.
  • 마이크로서비스에 최적화
    • 내부 통신은 REST보다 gRPC 채택률이 높음.

단점

  • 브라우저 직접 호출 어려움 (WebAssembly나 gRPC-Web 필요)
  • 개발자가 proto 작성, 컴파일 과정 이해 필요
  • 디버깅이 REST보다 불편

언제 gRPC를 써야 하나?

적합한 경우

  • 마이크로서비스 내부 통신
  • 고성능이 중요한 트래픽
  • 실시간 스트리밍 서비스
  • 다국어 서비스(서버는 Java, 클라이언트는 Go 등)
  • IoT, 게임 서버, 실시간 이벤트 처리

REST가 더 나은 경우

  • 브라우저 직접 호출 API
  • 단순한 public API
  • 사람이 읽기 편한 포맷이 필요할 때(JSON)

아래는 gRPC vs REST 차이를 한눈에 볼 수 있도록 정리한 비교 표입니다. 실무에서 판단 기준으로 쓰기 좋은 항목들만 골랐습니다.

gRPC vs REST 비교표

구분 gRPC REST
통신 프로토콜 HTTP/2 HTTP/1.1 (HTTP/2도 가능하나 대부분 1.1)
데이터 포맷 Protocol Buffers(바이너리) JSON, XML 등 텍스트 기반
속도 매우 빠름 (JSON보다 작고 parsing 효율적) 상대적으로 느림
스트리밍 지원 완전 지원 (양방향 스트리밍) 제한적 (Server-Sent Events / WebSocket 별도 필요)
인터페이스 정의 .proto 파일에서 타입·스키마 명확하게 정의 별도의 스키마 강제 없음(오픈 API 권장)
타입 안정성 컴파일 타임 검증 가능 런타임에 검증되는 경우가 많음
코드 생성 서버/클라이언트 Stub 자동 생성 Swagger/OpenAPI로 문서화는 가능하지만 Stub은 필수 아님
사용 편의성 브라우저 직접 호출 어려움(gRPC-Web 별도 필요) 브라우저/JavaScript에서 바로 사용 가능
인간 가독성 낮음 (바이너리) 높음(JSON 읽기 쉬움)
디버깅 어려움 (바이너리 포맷) 쉬움 (REST는 Curl·Postman으로 바로 요청 가능)
보안 TLS+HTTP/2 조합 매우 강력 표준적 TLS 보안
적합한 서비스 마이크로서비스 내부 통신, 고성능, 실시간 스트리밍 Public API, 외부 서비스 연동, 브라우저 중심 서비스
언어 지원 거의 모든 언어 공식 지원 언어 무관 (HTTP 지원하면 됨)
장점 요약 빠름, 효율적, 타입 안전, 스트리밍 강력 단순함, 디버깅 쉬움, 호환성 높음
단점 요약 복잡, 브라우저 접근성 낮음 성능 열세, 타입 안전성 부족

결론 요약

  • gRPC: 내부 통신/고성능/스트리밍에 최적
  • REST: 브라우저·대중 API·디버깅 편의성에 최적