gRPC 시작하기

gRPC란?

gRPC는 구조화된 데이터 직렬화에 적합하도록 설계된 Protocol Buffer 기반의 인터페이스 정의 언어(IDL; Interface Definition Language)를 사용하여 물리적 혹은 논리적으로 분산되어 있는 다수의 프로세스 사이에서의 고속 통신을 위한 원격 프로시저 호출(RPC; Remote Procedure Call) 프레임워크입니다.

gRPC의 특징

확장된 형식의 Protocol Buffer를 이용하여 메시지의 구조와 통신 메서드의 파라미터 및 반환 타입 등을 정의하므로 gRPC는 기본적으로 아래에 기술된 Protocol Buffer의 고유한 장점과 단점을 모두 가지게 됩니다.

  • Protocol Buffer의 장점
    • 사전에 정의된 형식을 이용하므로 애플리케이션 간의 통신에서 활용되는 메시지의 엄격한 타입 정의가 가능합니다.
    • 바이너리로 직렬화된 메시지를 교환하므로 텍스트 기반의 JSON, XML 등에 비해 그 크기가 작습니다.
  • Protocol Buffer의 단점
    • 메시지의 구조를 별도로 정의하여 관리해야 하고, 명세를 미리 정의하고 소프트웨어를 개발하는 계약 우선(Contract-First) 방식이 권장되므로 개발 조직 특성에 따라서 도입이 쉽지 않을 수 있습니다.
    • 메시지의 구조가 급격히 변경되면 이를 활용하는 클라이언트와 서버 코드를 다시 생성해야 하며, 이는 지속적 통합(CI; Continuous Integration)에 포함되어야 하므로 전체 개발 프로세스의 복잡도를 가중시킬 수 있습니다.

Protocol Buffer 기반의 IDL을 이용하여 명세된 서비스 정의를 통해 gRPC의 저수준 통신 구현이 추상화된 서버 스켈레톤과 클라이언트 스텁 코드를 자동으로 생성할 수 있으며, 개발자는 이를 이용하여 구현하는 소프트웨어에서 필요한 시점에 원격 프로시저를 간단하게 호출할 수 있습니다.

특히, gRPC는 특정 프로그래밍 언어에 종속되지 않도록 설계되어 있을 뿐만 아니라, Protocol Buffer 기반의 서비스 정의를 제공하므로 다양한 언어에서 작동가능한 Polyglot한 특성을 가집니다.

또한, gRPC는 고성능의 양방향 메시지 전송을 지원하는 HTTP/2 프로토콜을 사용하므로 서버와 클라이언트 사이의 메시지 교환을 위해 다양한 통신 방법을 활용할 수 있습니다.

gRPC 통신 패턴

gRPC는 다음의 네 가지 통신 방법을 제공합니다. Protocol Buffer로 정의된 메시지를 전달하므로 이를 발신하는 쪽(일반적으로 클라이언트 사이드)에서는 마샬링(Marshaling)을 수행하고, 수신하는 쪽(일반적으로 서버 사이드)에서는 언마샬링(Unmarshaling)을 수행하게 됩니다.

  • Unary RPC: 클라이언트에서 단일 요청이 발생하면 서버에서 단일 응답을 반환합니다. (일반적인 HTTP Request-Response 구조와 유사함.)
  • Server-Streaming RPC: 클라이언트에서 단일 요청이 발생하면 서버에서 연속적인 스트림 응답을 반환합니다. 클라이언트는 EOF에 도달할 때까지 스트림 데이터를 수신합니다.
  • Client-Streaming RPC: 클라이언트에서 연속적인 스트림 요청을 전송하면 서버는 단일 응답을 반환합니다. 서버는 EOF에 도달할 때까지 스트림 데이터를 수신하며, 수신 도중에 스트림을 취소하여 클라이언트의 메시지 전송을 조기에 중지할 수도 있습니다.
  • Bidirectional-Streaming RPC: 클라이언트와 서버 모두 독립적으로 동작하는 수신 스트림과 발신 스트림을 이용하여 서로에게 EOF에 도달할 때까지 연속적인 스트림을 전달할 수 있습니다.

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다