구글이 마이크로서비스를 위해 개발한 gRPC. HTTP/2와 Protocol Buffers를 통해 어떻게 압도적인 성능을 내는지, 그리고 REST API와는 무엇이 다른지 분석합니다.
**gRPC(google Remote Procedure Call)**는 구글이 개발하여 2015년에 오픈소스로 공개한 고성능 RPC 프레임워크입니다.
구글 내부에는 마이크로서비스 간의 방대한 통신을 처리하기 위해 10년 넘게 사용해 온 Stubby라는 시스템이 존재했습니다. gRPC는 이 Stubby를 바탕으로 범용성을 갖추어 재설계된 차세대 통신 규약입니다.
"네트워크 너머에 있는 서버의 함수를, 마치 내 로컬 객체의 메서드처럼 호출하자." 개발자는 네트워크 통신의 복잡함(직렬화, 소켓 연결 등)을 몰라도 됩니다. 그냥 함수를 호출하면 알아서 다 됩니다.
gRPC는 단순한 라이브러리가 아니라, 통신 계층부터 데이터 형식까지 모든 것을 최적화했습니다.
REST API가 주로 사용하는 HTTP/1.1과 달리, gRPC는 HTTP/2를 기본으로 사용합니다.
텍스트(JSON)가 아닌 바이너리(Binary) 형식의 데이터 직렬화 방식을 사용합니다.
사람이 읽을 수 있는 텍스트 형식입니다.
{
"name": "Seungwon",
"id": 1234
}
gRPC 개발의 중심에는 .proto라는 IDL(Interface Definition Language) 파일이 있습니다.
.proto 파일에 서비스와 주고받을 데이터 구조(메시지)를 정의합니다. 이것이
서버와 클라이언트 간의 불변의 계약서가 됩니다.
이 파일을 protoc 컴파일러에 넣으면, 각 언어(Java, Python, Go 등)에 맞는
Stub(대리자) 코드가 자동 생성됩니다.
개발자는 생성된 코드를 가져다 쓰기만 하면 됩니다. 필드명을 오타 내거나 잘못된 타입을 넣으면 컴파일 타임에 에러가 발생하여 버그를 원천 차단합니다.
| 비교 항목 | REST API | gRPC |
|---|---|---|
| 기반 프로토콜 | HTTP/1.1 (주로) | HTTP/2 |
| 데이터 형식 | JSON (Text) | Protobuf (Binary) |
| 가독성 | 좋음 (사람이 읽기 쉬움) | 나쁨 (별도 도구 필요) |
| 결합도 | 낮음 (유연한 소통) | 높음 (엄격한 규약) |
| 성능 | 보통 | 매우 높음 |
| 주요 용도 | 외부 공개용 API (Open API), 웹 | 내부망 서버 간 통신 (MSA) |
gRPC는 REST API의 자유로움을 포기하는 대신, 성능과 안정성을 얻는 선택입니다.
gRPC-Web
같은 프록시가 필요합니다. * 디버깅 난이도: 데이터가 바이너리로 날아가기
때문에 와이어샤크(Wireshark) 같은 별도 도구 없이는 눈으로 값을 확인하기
어렵습니다.