gRPC는 Google이 개발한 고성능 오픈소스 RPC(Remote Procedure Call) 프레임워크입니다. RPC란 원격 서버의 함수를 마치 로컬 함수처럼 호출할 수 있게 해주는 프레임워크입니다.

| 특징 | REST API | gRPC |
|---|---|---|
| 프로토콜 | HTTP/1.1 | HTTP/2 |
| 데이터 포맷 | JSON (텍스트) | Protocol Buffers (바이너리) |
| 성능 | 상대적으로 느림 | 빠름 |
| 스트리밍 | 제한적 | 4가지 스트리밍 지원 |
| 타입 안정성 | 런타임에 확인 | 컴파일 타임에 확인 |
gRPC는 내부적으로 데이터를 주고받을 때 Protocol Buffers (protobuf)를 사용합니다.
syntax = "proto3";
package user;
// 데이터 구조 정의 (Protocol Buffers)
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
message GetUserRequest {
int32 user_id = 1;
}
// 서비스 정의 (gRPC)
service UserService {
rpc GetUser(GetUserRequest) returns (User);
rpc CreateUser(User) returns (User);
rpc ListUsers(Empty) returns (stream User);
}
1) Unary RPC (단일 요청-응답)
가장 기본적인 형태로, 하나의 요청에 하나의 응답을 받습니다.
service Calculator {
rpc Add(AddRequest) returns (AddResponse);
}
message AddRequest {
int32 a = 1;
int32 b = 2;
}
message AddResponse {
int32 result = 1;
}
2) Server Streaming RPC (서버 스트리밍)
하나의 요청에 대해 서버가 여러 개의 응답을 스트림으로 전송합니다.
service FileService {
rpc DownloadFile(DownloadRequest) returns (stream FileChunk);
}
message DownloadRequest {
string filename = 1;
}
message FileChunk {
bytes data = 1;
int32 chunk_number = 2;
}
3) Client Streaming RPC (클라이언트 스트리밍)
클라이언트가 여러 개의 요청을 보내고, 서버가 하나의 응답을 반환합니다.
service FileService {
rpc UploadFile(stream FileChunk) returns (UploadResponse);
}
message UploadResponse {
string file_id = 1;
int64 total_size = 2;
}
4) Bidirectional Streaming RPC (양방향 스트리밍)
클라이언트와 서버가 동시에 여러 메시지를 주고 받습니다.
service ChatService {
rpc Chat(stream ChatMessage) returns (stream ChatMessage);
}
message ChatMessage {
string user_id = 1;
string message = 2;
int64 timestamp = 3;
}
참고 링크