
gRPC란 Google이 설계한 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 시스템으로, 서로 다른 애플리케이션 간의 통신을 간단하고 효율적으로 처리할 수 있도록 설계되었다. gRPC는 HTTP/2를 기반으로 동작하며, 성능과 확장성을 위해 최적화된 현대적인 RPC 프레임워크다.
서비스 정의
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
코드 생성
protoc --java_out=. --grpc-java_out=. example.proto
서버 구현
public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
HelloResponse response = HelloResponse.newBuilder()
.setMessage("Hello " + req.getName())
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
클라이언트 호출
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
HelloResponse response = stub.sayHello(HelloRequest.newBuilder().setName("World").build());
System.out.println(response.getMessage());
gRPC는 4가지 호출 방식(Method Type)을 지원한다:
한마디로 요즘 나온 기술의 장점은 다 가지고 있다
| 특징 | gRPC | REST API |
|---|---|---|
| 프로토콜 | HTTP/2 | HTTP/1.1 |
| 데이터 포맷 | Protocol Buffers (Protobuf) | JSON, XML |
| 성능 | 빠른 전송 속도 (Protobuf의 이진 데이터 전송) | 상대적으로 느림 (JSON/XML의 텍스트 기반 전송) |
| 지원되는 메서드 | 사용자 정의 가능, 유연한 RPC 호출 | GET, POST, PUT, DELETE 등 HTTP 표준 메서드 사용 |
| 양방향 통신 | 지원 (스트리밍 가능, 클라이언트 및 서버 스트리밍) | 기본적으로 지원하지 않음 (단방향 통신, WebSocket 필요) |
| 스키마 정의 | 강력한 스키마 정의 (.proto 파일 사용) | 일반적으로 없음 (스키마가 없거나 Swagger/OpenAPI 사용) |
| 언어 지원 | 다수의 언어 지원 (gRPC 툴로 코드 생성) | 모든 언어에서 지원 (HTTP 지원 언어라면 사용 가능) |
| 요구사항 | Protobuf 컴파일러 및 gRPC 런타임 필요 | 추가 도구 없이 바로 사용 가능 |
| 에러 처리 | gRPC 상태 코드와 커스텀 에러 메시지 지원 | HTTP 상태 코드 사용 |
| 브라우저 지원 | 직접 지원하지 않음 (gRPC-Web 사용 필요) | 브라우저에서 기본적으로 지원 |
| 보안 | 기본적으로 HTTP/2의 TLS 지원 | HTTPS를 통한 TLS 보안 |
| 호환성 | 버전 관리를 통한 강력한 호환성 유지 | 명시적인 버전 관리를 해야 함 |
| 설치 및 설정 | 초기 설정이 복잡할 수 있음 | 간단하고 설정이 쉬움 |
| 사용 사례 | 실시간 통신, 마이크로서비스 간 통신, 고성능 애플리케이션 | 웹 애플리케이션 API, 간단한 CRUD API |