gRPC란 무엇입니까? (요약: 빠른 API 통신)
gRPC에서는 데이터를 주고 받기 위한 프로토콜(통신 규약)을 '서비스(Service)'라는 규칙으로 나타냅니다.
gRPC는 구글(Google)에서 시작한 오픈소스이며, '원격 프로시저 호출(RPC, Remote Procedure Calls)'을 위한 시스템입니다. 쉽게 풀어서 쓰면, A 서버(gRPC 서버)에서 만들어 둔 함수를 B 서버(gRPC 클라이언트)가 사용할 수 있습니다. 양단에서 모두 함수를 제공·이용할 수 있도록 통신 인터페이스를 작성하여 양단에 미리 제공합니다.
특징
- gRPC는 HTTP/2를 기반으로 하는 RPC 프레임워크입니다.
- 서버 간 내부 통신을 빠르게 하기 위하여 사용하면 좋습니다.
- gRPC는 Protobuf(프로토콜 버퍼) 직렬화/역직렬화를 활용하여 통신하기 때문에 빠릅니다.
(통신 용량 절감, 파싱 간소화)
- gRPC는 자바 등 일부 언어 진영에서 proto3 신택스를 적용해 선언형으로 통신 인터페이스를 작성할 수 있습니다.
(+ 크로스 플랫폼 클라이언트 및 서버 바인딩: 우리말로 '교차 선택 가능')
따라서 이번 스프링 부트 gRPC 구현에서는 우리가 직접 인터페이스를 구현하지 않고, 자동으로 생성해 주는 수단을 활용합니다. (proto3)
프레임워크 특성상 자동으로 생성되는 것들이 있다면 '우리가 만든 적 없는 무언가'를 사용해야 할 때가 생긴다는 점에 유의합니다.
gRPC 구성을 이해하기 위한 구조는 어떻게 됩니까?
Use Case
먼저 마이크로서비스 간 통신을 한다고 가정해 보겠습니다!
예시를 위해, (a) 인증 정보를 관리하는 인증 서비스 서버, (b) 멤버 프로필 서비스 서버가 따로 존재한다고 하겠습니다.*
(* 구성은 예시일 뿐이며, 실제 구성은 조직에 따라 다르고 두 서버를 반드시 구분하는 것은 아님.)
- '회원가입'은 '인증 서버'를 통해 수행한다고 가정합니다.
- 인증 서버에서 '회원 프로필 서버'에 동기적으로 프로필 저장 함수를 호출하여 데이터가 잘 저장되는지 확인한다고 가정합니다.
- (gRPC 통신의 이해에 불필요한 그 외 아키텍처 패턴, 인프라 구성은 설명에서 생략합니다.)
이때 인증서버는 'gRPC 클라이언트(gRPC Client)'입니다.
이때 회원 프로필 서버는 'gRPC 서버(gRPC Server)'입니다.
이 두 곳에서 모두 공통적으로 사용할 수 있는 'gRPC 인터페이스'가 존재합니다.
gRPC 서버/클라이언트 구성
이제 다음 그림을 보며 다음 설명을 이해하면 됩니다.
- gRPC 인터페이스를 먼저 작성하게 됩니다.
- gRPC 인터페이스에는 gRPC 서비스를 작성합니다(Service Definition). 서비스는 proto3 신택스를 통해 선언형으로 쉽게 작성하고, 빌드 시 자동으로 라이브러리 형태로 생성합니다.
- 이 라이브러리를 별도 저장소(repository)/등기소(registry)에 올리거나, 프로젝트 내에 포함시켜 공유합니다.
- gRPC 서버 코드를 작성합니다. 이때 스프링 애플리케이션이 점유하는 포트와 별개로 gRPC 서버가 새 포트를 사용합니다.
- 코드는 gRPC 인터페이스 라이브러리를 통해 완성합니다.
- gRPC 클라이언트 코드를 작성합니다.
- 코드는 gRPC 인터페이스 라이브러리를 통해 완성합니다.
- gRPC 서버에 닿는 host/port만 잘 입력하면 갑자기 어느 순간 완성되어 있습니다.만, 다른 것들이 잘 작성되어 있다는 전제입니다.
이어지는 시리즈에서 팀원의 피땀눈물이 담겨 간략히 정리된 gRPC 구현 방식을 작성합니다.