gRPC가 뭔지 알아볼까?

Sun choi·2024년 11월 7일

gRPC

목록 보기
1/4
post-thumbnail

이번 프로젝트 때 고도화 문제로 결제서버와 티켓서버 간의 통신을 개선하는 방법에 gRPC를 적용하느 것에 고민되었다. 그래서 공부한 내용에 대해 정리를 해보겠다.


gRPC란?

구글이 만든 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크
gRPC는 서버와 클라이언트가 서로 원격에 있는 메서드를 호출하는 방식을 쉽게 구현할 수 있게 해주고, 효율적이고 고성능의 통신을 지원한다.
여기서 g는 구글을 의미하고, RPC는 한 시스템에서 다른 시스템의 메서드를 호출하는 것을 뜻한다. 결국 gRPC는 원격에서 다른 서버의 메서드를 직접 호출하는 것처럼 해주는 것!


gRPC의 주요 구성 요소

  • .proto 파일: gRPC에서는 Protocol Buffers라는 언어 중립적인 IDL(Interface Definition Language)을 사용한다. .proto 파일로 서비스의 인터페이스와 데이터 구조를 정의한다.

  • 서비스 및 메시지 정의: .proto 파일에서 서비스의 메서드와 요청/응답 형식을 정의하는데, 이는 클라이언트와 서버가 공통으로 이해할 수 있는 형태로 직렬화된다.

  • Stub: 서버와 클라이언트가 서로의 메서드를 호출할 때 사용되는 코드를 자동 생성해 주는 역할을 한다. 클라이언트는 서버 메서드를 호출할 때 Stub을 통해 호출하게 된다.

Protocol Buffers란?

구글이 개발한 언어 중립적이고 플랫폼 독립적인 데이터 직렬화 포맷
gRPC와 함께 사용하면 서버 간의 고속 통신을 구현할 때 특히 유리한데, 간단히 말해 데이터를 효율적이고 압축된 바이너리 형태로 변환하는 데 사용한다. JSON이나 XML과 같은 텍스트 형식과 달리, 프로토콜 버퍼는 데이터를 바이너리로 직렬화하므로 전송 속도가 훨씬 빨라 성능이 좋고 네트워크 대역폭도 덜 차지한다.성능이 중요한 대규모 시스템에서 많이 사용된다.
하지만, 사람이 읽기 어려운 바이너리 형식이므로 디버깅할 때 다소 어려울 수 있다. JSON처럼 직관적으로 데이터 구조를 읽기는 어렵기 때문에, 상황에 따라 적합하지 않을 수도 있다.

바이너리 형식이란?

데이터를 0과 1의 이진수 형태로 표현하는 방식
컴퓨터는 기본적으로 이진법을 사용해서 데이터를 처리하니까, 바이너리 형식은 컴퓨터가 가장 빠르고 효율적으로 이해하고 처리할 수 있는 형태라 할 수 있다.
고속 처리, 압축된 데이터 크기, 그러나 인간이 읽기 어려움!
바이너리 형식의 데이터 예시 중 하나가 Protocol Buffers이다.
바이너리 형식은 특히 네트워크 성능이 중요한 상황이나 대규모 데이터 전송에서 많이 사용되며, gRPC와 같은 프로토콜이 바이너리 형식을 사용하는 이유도 네트워크 효율성을 극대화하기 위해서이다.

데이터 직렬화란?

  • 직렬화(Serialization) : 데이터를 Protocol Buffers의 바이너리 형식으로 변환해 네트워크를 통해 전송하거나 저장할 수 있게 만드는 것.

  • 역직렬화(Deserialization) : 바이너리 형식의 데이터를 다시 원래의 구조로 변환해 사용 가능하게 하는 것.

이렇게 직렬화된 데이터는 JSON이나 XML보다 더 작고 더 빠르게 전송돼, 특히 네트워크 지연을 줄이는 데 효과적이다.


gRPC의 작동 방식

  • 프로토콜 컴파일 : 먼저 .proto 파일을 컴파일해 Stub 코드를 생성한다. 이 Stub은 클라이언트와 서버에서 요청과 응답을 주고받기 위한 메서드 호출에 사용된다.

  • 클라이언트-서버 통신 : 클라이언트는 Stub을 사용해 서버에 요청을 보내고, 서버는 응답을 Stub을 통해 돌려준다.

  • HTTP/2 기반 : gRPC는 HTTP/2를 사용해 성능과 효율성을 극대화한다. 멀티플렉싱(여러 요청을 한 번에 처리 가능)과 스트리밍 지원으로 속도가 빠르다.

  • 데이터 직렬화 : 데이터는 Protocol Buffers로 직렬화된다. 이는 JSON보다 빠르고 가벼운 바이너리 포맷이어서 네트워크 성능이 향상된다.

HTTP/2란?

HTTP/1.1의 다음 버전으로, 웹 성능을 개선하기 위해 만들어진 프로토콜
기존의 HTTP/1.1에서 발생하는 속도 및 효율성 문제를 해결하고, 웹 페이지 로딩 속도를 빠르게 하기 위해 여러 개선 사항을 도입했다.

HTTP/2의 주요 특징

  • 멀티플렉싱(Multiplexing)
    HTTP/2에서는 단일 연결로 여러 개의 요청과 응답을 동시에 처리할 수 있다. HTTP/1.1에서는 하나의 연결에서 한 번에 하나의 요청과 응답만 주고받을 수 있었기 때문에, 요청이 많을 경우 연결을 여러 개 만들어야 했지만, HTTP/2는 멀티플렉싱 덕분에 단일 연결에서 여러 데이터 스트림이 동시 전송되므로, 페이지 로딩 속도가 개선된다.
    아무튼 중요한 것은 병렬처리를 통해 더 빠르게 데이터를 요청하고 전송하고 수신할 수 있다는 것이다.
    웹 페이지의 리소스들이 병렬로 다운로드되며, 브라우저는 필요한 리소스를 비동기적으로 처리하여 로드 속도를 크게 향상시킬 가능성이 있다고 볼 수 있다.
  • 서버 푸시(Server Push)
    HTTP/2에서는 클라이언트가 요청하지 않은 리소스도 서버가 미리 푸시 할 수 있다. 예를 들어, 클라이언트가 HTML 파일을 요청하면, 해당 파일을 분석한 후 필요한 CSS나 JavaScript 파일을 클라이언트가 요청하기 전에 먼저 보내주는 것이다. 이렇게 미리 리소스를 전송해 주면, 웹 페이지의 로딩 시간을 줄이는 데 도움이 된다.

gRPC는 HTTP/2를 기본 프로토콜로 사용해서 저지연, 고성능의 통신을 지원한다. 위의 기능들 덕분에 gRPC는 요청을 빠르게 처리하고, 대량의 데이터를 효율적으로 전송할 수 있다. 멀티플렉싱과 서버 푸시 덕분에 실시간 통신 성능이 크게 향상돼서, 마이크로서비스 구조에서 서버 간 통신에 최적화된 성능을 발휘하게 된다. HTTP/2는 웹 서비스와 마이크로서비스의 통신 성능을 크게 개선할 수 있는 중요한 기술이며, gRPC와 함께 사용하면 최적의 성능을 낼 수 있기 때문에 서버 간 통신에서 강력한 선택이 된다.


gRPC의 통신 방식

gRPC는 네 가지 주요 통신 방식을 제공한다. 각각의 특성을 잘 이해하면 다양한 상황에 맞게 사용할 수 있다.

  • 단방향 통신 : 클라이언트가 서버로 요청을 보내고 응답을 받는 가장 일반적인 방식.

  • 서버 스트리밍 : 클라이언트가 서버로 요청을 보내고, 서버는 여러 개의 응답을 스트리밍 방식으로 보냄.

  • 클라이언트 스트리밍 : 클라이언트가 여러 개의 요청을 서버로 스트리밍하고, 서버는 한 번의 응답을 보냄.

  • 양방향 스트리밍 : 클라이언트와 서버가 서로 여러 번의 데이터를 스트리밍 방식으로 주고받는데 이를 통해 실시간 양방향 통신이 가능.


gRPC의 장점

  • 고성능: HTTP/2를 기반으로 하며, 이는 전송 속도를 크게 향상. HTTP/2의 멀티플렉싱 기능을 활용하여 한 연결에서 여러 요청과 응답을 동시에 처리할 수 있어 네트워크 대기 시간을 줄이고 대역폭 사용을 최적화

  • 언어 독립성: 다양한 언어를 지원해서 Java, Python, Go, Node.js 등과 쉽게 연동 가능. 이를 통해 언어에 상관없이 MSA에서 서로 다른 언어로 구현된 서비스 간 원활한 통신이 가능

  • 경량화: 효율적인 데이터 직렬화, Protocol Buffers를 사용해 데이터 전송이 효율적 -> 큰 데이터나 빈번한 통신에서 효과적

  • 스트리밍 지원: 양방향 스트리밍을 통해 데이터 양에 따라 유연한 대처 가능. MSA에서 실시간 데이터 처리가 필요한 경우 유용.

  • 보안 : gRPC는 HTTP/2의 TLS(Transport Layer Security)를 기본적으로 지원하며, 데이터 전송 중 암호화를 제공

  • 동기 및 비동기 통신 모두 가능해 다양한 통신 요구사항에 맞출 수 있음

  • 대규모 분산 시스템이나 MSA에 적합


gRPC와 REST의 차이점 및 결론

gRPC는 바이너리 형식으로 데이터를 전송하기 때문에 JSON 기반의 REST API보다 전송 속도가 빠르고 효율적이다.
REST는 텍스트 기반으로 개발이 직관적이지만, HTTP/1.1에 머무르기 때문에 HTTP/2를 사용하는 gRPC보다 성능 면에서 밀릴 수 있다.
REST는 다양한 클라이언트와의 호환성에서 아직 많이 쓰이지만, 성능과 속도가 중요한 시스템에서 gRPC가 우세할 수 있다.
요약하자면, gRPC는 빠르고 효율적인 서버 간 통신을 가능하게 해주는 프레임워크로, 성능 최적화와 효율성을 필요로 하는 프로젝트에 특히 유리하다.



profile
풀스택 개발자의 공부기록 📖

0개의 댓글