최근에 gRPC를 접할 기회가 생겼다. REST API만 사용했던 터라 새로운 기술을 만나게 되어 더 다양하게 적용해보고 싶은 마음이 들지만, 아직은 개발하는 단계에서 사용하기엔 오버엔지니어링의 느낌이 있어서 개념 + 활용 정도만 해볼 수 있었다. 그러나 선택지에서 REST APId에서 gRPC라는 게 추가되어 재밌게 정리해본다.
✅ RPC란?
https://aws.amazon.com/ko/compare/the-difference-between-rpc-and-rest/
RPC와 REST 비교 - API 아키텍처 간의 차이점 - AWS
원격 프로시저 호출(RPC)과 REST는 모두 인터넷 통신을 위해 해당하는 클라이언트와 서버 시스템 인터페이스를 설계하는 방법입니다. 그러나 구조, 구현 및 기본 원칙은 다릅니다. REST를 사용하여
aws.amazon.com
- 원격 프로시저 호출로 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술
- RCP API를 사용하면 개발자가 외부 서버의 원격 함수를 소프트웨어 로컬에 있는 것처럼 직접적으로 호출 할 수 있음
➡️ 함수 호출의 추상화로 네트워크 요청을 감춤
// 로컬에서 호출하지만 실제로는 네트워크로 호출됨
User user = userService.getUser(3);
🕰️ RPC는 1970년대에 등장하였고 REST API는 1990년대에 등장하였다. 시기로만 따지면 RPC가 먼저 개발된 것! 하지만 REST API가 일관화된 규칙으로 인해 널리 퍼지게 되었고 현재 표준처럼 자리잡았다.
📌 gRPC란?
https://grpc.io/docs/what-is-grpc/introduction/
Introduction to gRPC
An introduction to gRPC and protocol buffers.
grpc.io
- 구글에서 만든 오픈소스 Remote Procedure Call(= RPC, 원격 프로시저 호출)
- HTTP/2 프로토콜과 protocol buffers(직렬화)를 사용해 높은 성능과 확장성을 제공
- 클라이언트에서 서버와 동일한 메서드를 제공하는 스텁을 갖음 ➡️ 스텁을 자동생성
- 다양한 언어끼리 통신 가능(Java, Python, Go ... )
HTTP/2 프로토콜이 HTTP/1.1과 다른 점
- 양방향 통신, 병렬처리 지원
- HTTP/1.1은 TCP 프로토콜을 사용하여 3 way handshake 과정을 거쳐야하기 때문에 파일 전송 등에 대해 속도가 빠르지 않다.

왜 HTTP/2는 병렬처리가 가능한가?
- Stream: HTTP/2는 하나의 TCP 연결 안에서 여러 Stream을 동시에 만들어서 독립적인 요청/응답을 할 수 있음
- Multiplexing: 응답/요청 순서 상관 없이 병렬 처리 가능
- Binary Framing Layer: 각 프레임에서 Stream ID가 있는데, 프레임은 TCP 연결을 통해 순서 상관 없이 교차 전송이 가능함
gRPC 프로토콜 생성
🔧 프로토콜 버퍼(.proto)
https://protobuf.dev/overview/
- 구조화된 데이터를 직렬화 하는 구글의 오픈소스
- .proto 파일로 메시지에 타입과 변수명을 적어서 정의함
// gRPC 서비스 정의
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 메시지 타입 정의
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
- Greeter라는 서비스로 SayHello를 호출하면 HelloRequest를 보내고 HelloReply를 받음
🔧 프로토콜 버퍼 컴파일러(protoc)
- 컴파일러를 통해 .proto로부터 gRPC와 메시지 코드를 자동으로 생성
protoc --java_out=./build/generated \
--grpc-java_out=./build/generated \
--plugin=protoc-gen-grpc-java=path/to/protoc-gen-grpc-java \
greeter.proto
결과물
- HelloRequest.java
- HelloReply.java
- GreeterGrpc.java (클라이언트 Stub + 서버 인터페이스)
gRPC 서버 작성
public class GreeterServiceImpl extends GreeterGrpc.GreeterImplBase {
@Override
public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
String message = "안녕하세요, " + request.getName() + "님!";
HelloReply reply = HelloReply.newBuilder().setMessage(message).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
- GreeterGrpc를 상속받아서 서버 작성 후 gRPC로 서버 실행
Server server = ServerBuilder
.forPort(50051)
.addService(new GreeterServiceImpl())
.build()
.start();
gRPC Client 작성
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 50051)
.usePlaintext()
.build();
GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
HelloRequest request = HelloRequest.newBuilder()
.setName("홍길동")
.build();
HelloReply reply = stub.sayHello(request);
System.out.println(reply.getMessage());
channel.shutdown();
- 클라이언트는 stub을 호출해서 결과를 가져오면 된다.
결론
gRPC는 .proto로 통신에 필요한 내용을 정의하고 (Swagger의 역할을 하기도 한다) 서버와 클라이언트를 작성하여서 통신한다. 클라이언트에서는 함수를 사용하듯이 사용할 수 있다.
서버, 클라이언트, LB 등등 모든 관련된 부분이 HTTP/2를 지원해야지만 사용이 가능하지만 속도에서 큰 장점이 있기 때문에 응답속도가 중요한 실시간 스트리밍 등에 많이 사용된다. 최근 요청이 많은 AI들도 gRPC로 하면 우수한 성능 속도를 보인다.
REST API 뿐만 아니라 하나의 선택지를 더 생각할 수 있는 기술임이 분명해 보인다.
'IT > 개발' 카테고리의 다른 글
쿠버네티스(Kubernetes)가 대체 뭔데? with Docker (0) | 2025.03.23 |
---|---|
blot.new를 아시나요? (2) | 2024.11.29 |
[TypeScript] Typescript 장점과 타입 (0) | 2022.04.08 |
[git] 자주 쓰는 git 명령어 정리 (0) | 2022.03.18 |
[DB] SELECT ~ FOR UPDATE (0) | 2021.11.05 |