Skip to main content

Command Palette

Search for a command to run...

gRPC란?

gRPC의 원리와 개념에 대하여

Updated
•3 min read•View as Markdown
gRPC란?

gRPC란?


gRPC는 구글에서 만든 고성능 RPC 프레임워크이다. 그렇다면 RPC가 무엇인지 간단히 짚고 넘어가도록 하자.

RPC(Remote Procedure Call)은 떨어져있고 분산되어있는 컴퓨터들이 원활하게 통신을 할 수 있도록 해주는 기능이다. 이로 인해 각 컴퓨터들이 다른 컴퓨터에 있는 함수를 호출(Call)할 수 있어 RPC라 이름붙여졌다.

gRPC는 이 속성을 그대로 가지고 있는데, 주로 MSA의 서비스들간의 통신에 이용된다. 이때 각 서비스들의 프로그래밍 언어가 다르더라도 연결 할 수 있다. 이는 전 아티클에서 이야기했던 IDL(Interface Definition Language)의 지향점으로, 한 서비스가 파이썬을 사용하고, 다른 한 서비스가 Go언어를 사용하더라도 통신할 수 있도록 해준다.

각 서비스의 중간에서 gRPC는 언어 중립적으로 해석하여 서로간의 언어를 이해할 수 있도록 돕는다. 이때 사용되는 방식으로는 직렬화(serialization) 역직렬화(deserialization)가 있다. 이 방식은 각자의 언어를 조금 더 컴퓨터 지향적 언어인 바이너리 파일(바이트로 표현된 방식)로 변환하여 서로간의 이해를 돕는다.

Protocol Buffer란?


gRPC에서는 이 과정을 행할때, Protocol Buffer는 구글이 개발한 데이터 직렬화 방식을 이용한다. proto 파일로 데이터 구조를 정의하면, 각 언어(Python, Java, Go 등)에 맞는 코드가 자동 생성된다.

(Protocol: 데이터를 표현하는 규약) (Buffer: 데이터를 담는 중간 형식)

이 완충작용은 .proto라는 이름의 확장자로 행하게 되는데, 이 파일을 통해서 각 서비스가 다른 서비스에 있는 함수를 호출할 수 있게 된다.

특히, 다른 함수를 호출하게 될 때는 stub. 이라는 이름의 가짜 함수를 사용하게 되는데, 이를 이용하여 원격 함수를 마치 내 컴퓨터에 있었던 함수인 것 마냥 호출할 수 있게 해준다. 서로 다른 언어를 사용하더라도 마찬가지다.

gRPC의 장점


앞서 말했듯 gRPC는 각 서비스(혹은 컴퓨터)끼리 이어주는 역할을 하게 된다. 원래 각 서비스끼리 연결될 때는 텍스트 기반 방식인 Json, Xml등의 파일을 사용하게 되는데, 이는 사람이 읽기 쉬운 언어로 구성되어있다. 따라서 기계가 읽을 수 있는 방식보다는 조금 덜 효율적이다.

그래서 텍스트 기반 방식이 아니라 바이너리 방식으로 각 서비스를 이어주게 되는데, 이 바이너리 방식의 이점은 Json파일보다 더 압축적이고 빠르다는 것이다. 앞서 이야기했듯이 Json파일은 사람이 읽기 쉬운 방식으로 구성되어있기에, 계속해서 Json파일의 호출과 응답이 많아지게 될 수록 낭비되는 리소스가 커진다. 따라서, 바이너리 방식을 사용하여 좀 더 간편하고 빠르게 전달할 수 있게 된다.

또한, gRPC는 HTTP/1 기반이 아닌 HTTP/2 기반이기에 오는 이점이 또 있다. 아래는 gRPC의 코어를 설명한 것이다.

이와 같이 gRPC는 HTTP/2 위에 올려져 있기 때문에 HTTP/2의 이점을 모두 흡수하게 된다.

먼저, HTTP/2는 TLS 보안 방식을 이용하여 1보다 더 안전하고, 요청과 응답을 수행하는 부분에 있어서도 더 빠르고 자유롭다. HTTP/1의 경우, 요청과 응답에 순서가 존재하는데, 마치 편지처럼 요청이 있어야 응답이 있고, 또 그 응답을 받아야 다시 요청을 보낼 수 있는 순차적인 모습을 가진다. 하지만 HTTP/2는 전화처럼 상대방이 이야기하고 있을 때도 내가 말할 수 있고, 다시 상대방이 내 말을 끊고 이야기할 수 있다. 이렇게 순차적이지 않은 HTTP/2의 속성으로 인해 응답을 기다리지 않고 요청을 보낼 수 있으며 여러 메세지를 한 번에 보낼 수도 있다.

HTTP/1.1의 경우:

  • 한 번에 하나의 요청

  • 응답만 처리 (Head-of-Line Blocking)

  • 첫 번째 응답을 받아야 다음 요청 가능

  • 마치 단일 차선 도로

HTTP/2의 경우

  • 하나의 연결에서 여러 요청

  • 응답을 동시 처리 (Multiplexing)

  • 응답 순서와 무관하게 여러 요청 가능

  • 마치 다차선 고속도로

결론


간단히 gRPC에 대하여 살펴보았는데, gRPC는 각 서비스끼리 언어가 다르더라도 빠르고 간편하고 안전한 통신을 보장하여 더 효율적으로 서비스들끼리 결합될 수 있도록 돕는다. 특히, proto 파일을 이용하여 사용자는 stub이라는 가짜 함수로 서버의 함수들을 마치 자신이 가지고 있었던 함수인 양 호출할 수 있도록 돕는다.