Protocol Buffers, gRPC

노력을 즐기는 사람·2021년 3월 7일
2

sia 인턴십

목록 보기
1/7

Protocol Buffers

공식문서에서는 Protocol Buffers를 아래와 같이 소개하고 있다.

Protocol Buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data

즉, 언어(Java, Go, JS)에 중립적이며 플랫폼(API Server, gRPC Server, Database)에 중립적이며 확장성이 좋은, 직렬화된 데이터를 위한 매커니즘이라고 한다.

다시 말해서 크게 세 가지의 장점을 가지고 있다

  • 언어, 플랫폼에 구애 받지 않는다.
  • 확장성이 좋다
  • 직렬화된 데이터를 다룬다.

계속 읽어보자.

think XML, but smaller, faster, and simpler.

즉, XML과는 비슷하지만 훨씬 더 작은 크기를 가지며 빠르고 간단한 장점을 가진다.

또 읽어보자.

You define how you wnat your data to be structured once, then you can use special generated source code to easily wirte and read your structured data to and from a variety of data streams and using a varitey of languages

즉, 데이터가 어떻게 구조화될 것인지를 단 한번만 정의하면, 특수하게 생성된 소스 코드를 사용하여 우리의 구조화된 데이터를 다양한 데이터 스트림과 다양한 언어로부터 쉽게 쓰고 읽을 수 있으며, 다양한 데이터 스트림과 다양한 언어로부터 쉽게 쓰이고 읽힐 수 있다.

키워드를 조금 정리해보자.

  • 데이터 구조화 명세를 한번만 작성하면 위에 언급한 장점들을 모두 사용가능하게 된다.

특수하게 생성된 소스 코드는 protocol buffered compiler가 생성해준다.
지금은 C++/C#/Dart/Go/Java/Python만 지원한다.

Language Guide (proto3)

이 문서를 읽으면 protocol buffer language를 활용해서 .proto에 포함된 protocol buffer data를 구조화할 수 있고 어떻게 .proto3로부터 data access class를 생성하는지 알 수 있다.

일단은 gRPC가 뭔지 알아보고 필요하다고 판단되면 읽어보자.

gRPC

gRPC는 protocol buffers를 IDL(Interface Definition Language)로서 사용할 수도 있고 message format interchanger로도 사용할 수 있다.

gRPC에서는 클라이언트가 마치 로컬 오브젝트인양 다른 디바이스에서 동작중인 서버의 메서드를 직접적으로 호출함으로써 distriuted applications/service(분산 서버/MSA를 말하는 듯 하다)를 생성하는 것을 쉽게 만든다.

많은 RPC 시스템들은 메서드들이 파라미터와 리턴 타입을 사용하여 원격으로 호출될 수 있도록 메서드를 특정하고 있다.

서버 진영에서는 인터페이스를 구현하고 클라이언트의 요청을 수행하기 위해서 gRPC 서버를 실행시킨다.
클라이언트 진영에서는 서버와 동일한 메서드를 제공하는 stub(뭉터기)들이 있다.

그림을 보면 gRPC Server와 gRPC Stub와 통신을 하는 것을 볼 수 있다.

gRPC의 서버와 클라이언트는 다양한 환경에서 서로 통신하고 실행될 수 있다. 물론, gRPC가 지원하는 어떤 언어로든지 작성될 수도 있다.
예를들어 Java 기반의 gRPC 서버는 Go, Python, Ruby로 작성된 클라이언트들과 통신할 수 있다.

Protocol Buffers 사용하기

gRPC는 기본적으로 Protocol Buffers를 사용하도록 되어 있다.

protocol buffers를 사용하려면 가장 먼저 직렬화 하고 싶은 데이터를 구조화하기 위한 명세를 .proto 파일에 정의해야 한다.
protocol buffer의 데이터는 message로 구조화된다.
message는 filed라고 불리는 이름-값 쌍을 포함하는 정보들로 구성된다.

예시를 살펴보자

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

데이터 명세를 한번만 작성하면 protoc라는 컴파일러로 data access class를 생성할 수 있다.
생성된 data access class는 각 필드들에 name()이나 set_name() 같은 바이트 스트림으로 직렬화하거나 바이트 스트림으로부터 파싱하기 위한 메서드들도 제공한다.

만약 C++ 코드가 생성된다고 하면 Person 이라는 클래스가 생성된다.
생성된 클래스를 활용해서 모든 동작을 할 수 있다.

또, gRPC 서비스를 정의할 수 있다. gRPC 서비스는 RPC 메서드로 구성되며 RPC 메서드의 파라미터와 리턴 타입이 protocol buffer message로 구성되어 있다.

아래 예시를 살펴보자

service Greeter {
	rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
	string name = 1;
}


message HelloReply {
	string message = 1;
}

아직 좀 감이 안온다..
좀 써보고 다시 작성합시다

profile
노력하는 자는 즐기는 자를 이길 수 없다

0개의 댓글