[번역] gRPC 소개

jakeseo_me·2021년 1월 21일
0

네트워크

목록 보기
7/14

Prologue

이 글은 GRPC 공식문서에 있는 글을 번역한 글입니다.

gRPC와 프로토콜 버퍼에 대한 소개

이 페이지에서는 gRPC와 프로토콜 버퍼에 대해서 소개합니다. gRPC는 프로토콜 버퍼를 인터페이스 정의 언어(IDL, Interface Definition Language)와 아래에 깔려있는(underlying) 메세지 교환 포맷으로 사용합니다. gRPC와 프로토콜 버퍼에 처음 입문한다면, 이 글을 읽으면 도움이 많이 될 것입니다. 만일 그냥 실무적인 gRPC 지식이 필요하다면 여기서 언어를 고르고 살펴보면 됩니다.

개요

gRPC에서는 클라이언트 애플리케이션이 마치 로컬 오브젝트처럼 직접적으로 다른 머신 위에 얹어진 서버 애플리케이션의 메소드를 호출할 수 있습니다. 분산된(distributed) 애플리케이션과 서비스를 쉽게 만들수 있도록 해줍니다. 다른 많은 RPC 시스템처럼, gRPC는 서비스를 정의한다는 아이디어를 근간으로 합니다. 서비스에는 원격으로 호출될 수 있는 메소드가 파라미터와 리턴 타입과 함께 명시되어 있습니다. 서버 사이드에서, 서버는 이 인터페이스를 구현하고, 클라이언트의 호출을 다룰 수 있는 gRPC 서버를 운영합니다. 클라이언트 사이드에서는 클라이언트가 서버와 같은 메소드를 제공하는 stub (일부 언어에서는 그냥 client라는 용어로 참조됩니다.) 이란 것을 가집니다.

gRPC 클라이언트와 서버는 다양한 환경 속에서 운영되고 서로 통신할 수 있습니다. 구글 내부에 있는 서버로부터 우리의 데스크탑까지도 가능합니다. 그리고 gRPC를 지원하는 언어면 어떤 언어로든 쓰여질 수 있습니다. 그래서 이를테면, gRPC서버는 자바로 구현하고 클라이언트는 Go, Python, Ruby로 구현해도 됩니다. 추가로, 최근 구글 API들은 우리가 구글이 제공하는 기능들을 우리 애플리케이션에 쉽게 넣어 빌드할 수 있는 인터페이스들의 gRPC 버전들을 가질 것입니다.

프로토콜 버퍼 사용법

기본 값으로, gRPC는 Protocol Buffers를 사용합니다. Protocol Buffers는 구조화된 데이터를 직렬화하기 위한 구글의 성숙한 오픈소스 매커니즘입니다. (JSON과 같은 데이터 포맷으로 사용될 수 있음에도 불구하고) 여기 어떻게 동작하는지에 대한 간략한 소개가 있습니다. 만일 이미 프로토콜 버퍼와 친숙하다면, 다음 섹션은 그냥 넘어가도 무방합니다.

프로토콜 버퍼를 사용할 때, 첫번째 단계는 직렬화하고 싶은 데이터에 대한 구조를 .proto 파일에 정의하는 것부터 시작됩니다. 프로토콜 버퍼는 messages로 구조화됩니다. 각 메세지가 name-value 짝으로 이루어진 field를 포함한 정보의 작은 논리적인 기록이 있는 곳입니다.

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

일단 데이터 구조를 명시하면, 프로토콜 버퍼 컴파일러인 protoc를 이용하여 proto 정의 파일로부터 원하는 언어의 데이터 접근 클래스들을 만들어낼 수 있습니다. 이러한 데이터 접근 클래스들은 각 필드에 대한 간단한 접근자들 (name(), setName()과 같은)을 제공합니다. 또한 전체 구조를 raw bytes로 직렬화/파싱할 수 있는 메소드들도 제공합니다. 이를테면, C++ 언어를 선택했다면, 위의 예제로 작성된 .protomessage Person을 컴파일러로 돌렸을 때, Person이라 불리는 클래스가 생성됩니다. 이후에 우리는 이 클래스를 어플리케이션에서 만들어내고, 직렬화할 수 있고, Person 프로토콜 버퍼 메세지들을 가져올 수 있습니다.

gRPC 서비스를 프로토콜 버퍼 메세지에 명시된 것 처럼 파라미터와 리턴 타입과 함께 일반 proto 파일에 정의할 수 있습니다.

// The gretter service definition
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) return (HelloReply) {}
}

// The request message containing the user's name
message HelloRequest {
  string name = 1;
}

// The response message contraining the greetings
message HelloReply {
  string message = 1;
}

gRPC는 proto 파일로부터 코드를 생성하기 위해서 특별한 gRPC 플러그인과 함께 protoc를 사용합니다. 생성된 gRPC 클라이언트와 서버 코드와 통상적인 프로토콜 버퍼 코드를 얻을 수 있습니다. 프로토콜 버퍼 코드를 이용하여 메세지 타입을 만들어내거나, 직렬화하거나, 불러올 수 있습니다. 아래의 예제에서 확인할 수 있습니다.

우리가 선택한 언어의 gRPC 플러그인을 갖고 있는 protoc 설치방법과 프로토콜 버퍼에 대해 더 배우고 싶다면, 프로토콜 버퍼 공식 문서를 참조하면 됩니다.

프로토콜 버퍼 버전

프로토콜 버퍼는 이전부터 오픈소스 사용자들이 사용 가능했지만, 이 사이트에서는 대부분의 예제가 프토콜 버퍼 버전 3(Proto3)을 사용하고 있습니다. 3버전은 문법이 좀 더 간결해졌고, 유용한 새로운 기능이 있으며, 더 많은 언어를 지원합니다. Proto3Java, C++, Python, Objective-C, C#, lite-runtime (Android Java), Ruby, Javascript 등에서 사용할 수 있습니다. 프로토콜 버퍼 깃허브 리포지토리에서 확인 가능합니다. Go를 사용한다면, Go 프로토콜 버퍼 깃허브 리포지토리에 가서 확인해보시면 됩니다. 프로토콜 버퍼3 언어 가이드참고 문서도 각 언어별로 찾아볼 수 있습니다. 참고 문서는 .proto 파일 형식의 공식 명세를 포함합니다.

일반적인 용도로, proto2도 사용할 수 있는 반면에 우리는 gRPC와 함께 proto3을 사용하는 것을 권장합니다. proto3를 사용하면 gRPC를 지원하는 모든 언어들을 다 사용 가능합니다. 또한 proto2 클라이언트가 proto3 서버로 무언가 전송하는데에 생기는 호환성 이슈도 해결할 수 있습니다.

profile
대전에 있는 (주) 아이와즈에서 풀스택 웹개발자로 일하고 있는 서진규입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: spring, node.js, nest.js, JPA, type orm 에 관심이 있습니다.

관심 있을 만한 포스트

0개의 댓글