gRPC는 Google이 개발한 고성능 오픈소스 RPC(Remote Procedure Call) 프레임워크로, 주로 대기 시간이 짧고 데이터 처리량이 높은 네트워크 통신을 위해 설계되었다. HTTP/2를 기반으로 동작하며, 데이터 직렬화에는 Protocol Buffers를 사용하여 기존의 JSON, XML보다 더 효율적인 통신을 가능하게 한다. gRPC를 이해하기 위해서는 먼저 RPC 개념을 알아보자.
RPC(Remote Procedure Call)
RPC는 원격 프로시저 호출(Remote Procedure Call)의 약자로, 분산된 시스템에서 서로 다른 주소 공간에 있는 프로세스 간에 통신을 할 수 있도록 도와주는 기술이다. 쉽게 말해, 로컬에서 함수를 호출하듯이 원격 서버의 함수를 호출하는 개념이다. 이때 개발자는 별도의 네트워크 관련 코드를 작성할 필요 없이, 마치 로컬 함수처럼 원격 서버의 함수를 호출할 수 있다.

RPC는 클라이언트-서버 구조에서 동작하며, 클라이언트가 요청을 보내면 서버가 그에 대한 응답을 반환하는 방식이다. 이때 중요한 개념이 Marshalling인데, 클라이언트와 서버가 데이터를 주고받기 위해 객체를 적절한 형식으로 변환하여 메모리에 표현하는 과정이다. 이를 통해 데이터가 네트워크 상에서 효율적으로 전달될 수 있게 된다.
이러한 RPC 방식은 네트워크와 시스템의 복잡성을 숨기고, 더 직관적인 프로그램을 작성할 수 있게 해준다. gRPC는 이러한 RPC 개념을 바탕으로, 현대 네트워크 환경에 최적화된 고성능 통신을 구현하기 위해 개발된 것이다.
gRPC
gRPC는 현대 소프트웨어 개발에서 특히 마이크로서비스 아키텍처(MSA, Microservices Architecture)와 잘 맞는 프레임워크이다. MSA는 하나의 큰 애플리케이션을 여러 개의 작은 서비스로 나누어 각각 독립적으로 배포하고 관리할 수 있게 하는 방식이다. 이때 각 서비스는 독립적으로 개발되고 실행되지만, 서로 데이터를 주고받으며 협력해야 한다. 이 과정에서 효율적인 통신이 필요하며, 이를 해결하는 도구 중 하나가 바로 gRPC이다.
마이크로서비스 환경에서는 여러 개의 작은 서비스들이 서로 상호작용해야 하는데, 이 상호작용이 빈번하고 고성능이 요구되는 경우가 많다. 전통적인 REST API는 HTTP 1.1 기반으로 작동하며 텍스트 형식의 JSON이나 XML을 주로 사용하기 때문에 데이터 크기가 크고 처리 속도가 느리다. 반면, gRPC는 HTTP/2 기반으로 작동하며 Protocol Buffers라는 이진 데이터 직렬화 방식을 사용하기 때문에 더 적은 대역폭을 사용하고 빠르게 데이터를 주고받을 수 있다.

이러한 특성 덕분에 gRPC는 특히 마이크로서비스 환경에서 빈번한 서비스 간 통신을 효율적으로 처리할 수 있는 강력한 도구로 자리잡았다. 또한, gRPC는 여러 언어에서 클라이언트와 서버 코드를 자동으로 생성해주기 때문에, 다양한 언어로 개발된 마이크로서비스들 간의 통합 작업이 매우 간편해진다.
gRPC의 주요 구성 요소
gRPC는 클라이언트와 서버 간의 효율적인 통신을 위해 여러 가지 중요한 구성 요소들로 이루어져 있다. 각각의 구성 요소는 서로 다른 역할을 담당하며, 이를 통해 고성능의 RPC(Remote Procedure Call)를 구현할 수 있다.
1. Stub
Stub은 클라이언트가 원격 서버의 메소드를 호출할 수 있도록 만들어진 인터페이스다. 클라이언트는 Stub을 통해 로컬에서 함수를 호출하듯이 서버의 함수를 호출할 수 있으며, 이때 데이터는 클라이언트와 서버 간에 메시지로 주고받는다. Stub은 메시지의 Marshalling/Unmarshalling을 처리하는 역할을 하며, 클라이언트와 서버 사이의 통신을 추상화해준다.
2. Protocol Buffers (proto)
gRPC는 Protocol Buffers를 사용하여 메시지를 직렬화하고, 클라이언트와 서버 간의 데이터를 주고받는다. Protocol Buffers는 Google에서 개발한 직렬화 포맷으로, JSON이나 XML에 비해 데이터 크기를 줄이고, 처리 속도를 크게 높일 수 있다. 이를 통해 gRPC는 고성능 통신을 가능하게 한다.
- .proto 파일: gRPC에서는 `.proto`라는 파일 확장자를 가진 스키마 정의 파일을 사용하여 서비스 인터페이스와 메시지 구조를 정의한다. 이 파일을 통해 gRPC는 서버와 클라이언트 간의 계약을 명확히 할 수 있다.
3. protoc 컴파일러
`.proto` 파일을 바탕으로 protoc라는 컴파일러가 클라이언트와 서버 코드를 자동으로 생성해준다. 이를 통해 각 언어에 맞는 클라이언트와 서버 구현체가 만들어지며, 개발자는 복잡한 통신 로직을 구현할 필요 없이 자동 생성된 코드를 사용하여 개발할 수 있다.
4. Channel
Channel은 클라이언트와 서버 간의 통신 경로를 설정하는 역할을 한다. 클라이언트는 채널을 통해 서버와의 연결을 맺고, 이 연결을 통해 RPC 호출을 전송한다. 채널은 여러 가지 설정을 통해 통신에 대한 다양한 옵션을 설정할 수 있으며, 클라이언트가 여러 개의 요청을 보낼 때 효율적으로 관리된다.
5. Marshalling/Unmarshalling
Marshalling은 클라이언트가 보낼 객체를 네트워크 전송을 위해 Protocol Buffers를 사용하여 직렬화하는 과정이다. 반대로 Unmarshalling은 서버가 수신한 메시지를 다시 객체로 변환하는 과정이다. 이를 통해 클라이언트와 서버는 데이터 객체를 서로 주고받을 수 있다.
6. Service 정의
gRPC는 서버에서 제공하는 서비스와 그에 대한 RPC 메소드들을 `.proto` 파일에서 정의한다. 이때 각 서비스는 함수 호출을 위한 인터페이스를 제공하며, 이를 통해 클라이언트는 서버의 메소드를 원격으로 호출할 수 있다.
7. HTTP/2 기반 통신
gRPC는 HTTP/2를 기반으로 통신을 한다. HTTP/2는 기존의 HTTP 1.1과 비교하여 여러 가지 이점을 제공하는데, 특히 다중화(multiplexing)를 통해 여러 요청을 동시에 처리할 수 있고, 헤더 압축을 통해 네트워크 효율성을 극대화한다. 또한, gRPC는 HTTP/2의 양방향 스트리밍을 지원하여 클라이언트와 서버가 동시에 데이터를 주고받을 수 있다.
gRPC의 장점
1. IDL 기반의 클라이언트-서버 코드 자동 생성
gRPC는 IDL을 통해 프로토콜을 정의한 후, protoc 컴파일러를 사용하여 각 언어별 클라이언트 및 서버 코드를 자동으로 생성한다. 이를 통해 개발자가 일일이 클라이언트 코드를 작성할 필요가 없으며, 이는 개발 시간을 크게 절약해준다. 또한, IDL을 기반으로 코드를 생성하므로, 이를 통해 Single Source Of Truth(SSOT)를 유지할 수 있어 클라이언트와 서버 간의 커뮤니케이션 비용을 절감한다.
2. 빠르고 효율적인 데이터 전송
Protocol Buffers는 데이터 직렬화 방식 중 하나로, 데이터를 압축하여 전송함으로써 JSON이나 XML에 비해 전송 속도가 훨씬 빠르다. 이는 특히 네트워크 대역폭이 제한적인 환경에서 매우 유리하다.
'Network' 카테고리의 다른 글
| HPC(High-Performance Computing) (0) | 2025.02.11 |
|---|---|
| HTTP/3 (0) | 2024.09.27 |
| SmartNIC (0) | 2024.09.19 |
| FD.io Vector Packet Processor (VPP) with DPDK (0) | 2024.09.09 |