주요 기능
프로토콜 버퍼(Protocol Buffers)는 데이터를 이진수로 변환해줍니다. 데이터를 이진수로 변환하면 문자열보다 크기가 작고 대역폭을 적게 사용하기 때문에 더 빠르게 전송할 수 있고, CPU 사용량이 감소하는 장점이 있습니다. 하지만 프로토콜 버퍼로 인해 변환된 데이터는 JSON, XML과 다르게 사람이 읽을 수 없습니다.
변환된 데이터를 사용할 플랫폼에서 이진수를 지원하지 않아도 프로토콜 버퍼를 사용하면 문자열로 변환할 수 있습니다.
Message Type 정의
프로토콜 버퍼에는 타입을 지정할 수 있는 Message
가 있습니다. Go의
struct, Typescript의 interface/type와 같이 필드를 가질 수 있습니다. 다음과 같이 프로토콜 버퍼로 들어오는 요청에 대한 타입을 작성할 수 있습니다.
// 검색 요청 시 받을 값
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
필드의 타입들은 스칼라 타입(Scalar Types)입니다. 위의
예제에서 query
는 string
(문자열) 타입,
page_number
와 result_per_page
는 int32
(정수) 타입을 가집니다.
Field Numbers
Message
에서 각 필드들은 고유한 숫자를 가집니다. 이 숫자는 Message Binary Format에서 필드를 식별하는데
사용되고, 한번 사용된 숫자는 다시 사용할 수 없습니다.
1~15 사이는 필드 번호와 필드 타입(값
제외)을 포함해 인코딩하는데 1 바이트(8 비트)
를 사용합니다. 필드 번호와 필드 타입(wire_type)을 이진수로 변환하는 식은 다음과 같습니다.
예를 들어 1번 필드는를 사용합니다. 첫 번째은 MSB(Most
Significant Bit)를 위해, 는
wire_type
을 저장하기 위해, 마지막 1은 1을 이진수로 변환했을 때 를 사용하기 때문에 총를 사용합니다. 위와 같은
방법으로 16번 필드는 로 를 사용합니다.
사용 가능한 가장 작은 숫자는 1이고, 가장 큰 숫자는 , 즉, 까지 사용할 수 있습니다. 또한, 에서 는 예약 번호로, 사용할 수 없습니다.
Field Rules
required
: 해당 필드는 필수로 받습니다. proto2
optional
: 해당 필드는 옵션입니다. proto2
repeated
: 해당 필드가 여러 번 반복됩니다. (배열) proto2 / proto3
Service 정의
위에서 작성한 Message
로 RPC(Remote Procedure
Call) Service Interface를 정의할 수 있습니다. 그리고 Protocol Buffers Compiler가 선택한 언어로 Interface와 Stub을 생성해 줍니다.
예를 들어 SearchRequest
를 받아 SearchResponse
로 응답하는 메소드는 다음과 같이 정의할 수 있습니다.
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse);
}