본문 바로가기
IT/개발

gRPC란 무엇인가

by TERII 2025. 4. 25.
SMALL

최근에 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 과정을 거쳐야하기 때문에 파일 전송 등에 대해 속도가 빠르지 않다.

출처 https://mondaymonday2.tistory.com/980

 

왜 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 뿐만 아니라 하나의 선택지를 더 생각할 수 있는 기술임이 분명해 보인다.

반응형
LIST