티스토리 뷰

Go

프로토콜 버퍼 - Protocol Buffers

Miles 2021. 3. 18. 22:19

주요 기능

프로토콜 버퍼(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)입니다. 위의 예제에서 querystring(문자열) 타입, page_numberresult_per_pageint32(정수) 타입을 가집니다.

Field Numbers

Message에서 각 필드들은 고유한 숫자를 가집니다. 이 숫자는 Message Binary Format에서 필드를 식별하는데 사용되고, 한번 사용된 숫자는 다시 사용할 수 없습니다.

1~15 사이는 필드 번호와 필드 타입(값 제외)을 포함해 인코딩하는데 1 바이트(8 비트)를 사용합니다. 필드 번호와 필드 타입(wire_type)을 이진수로 변환하는 식은 다음과 같습니다.

( f i e l d _ n u m b e r < < 3 ) w i r e _ t y p e (field\_number<<3)|wire\_type

예를 들어 1번 필드는 1 + 3 + 1 = 5   b i t s 1+3+1=5\ bits 를 사용합니다. 첫 번째 1   b i t 1\ bit MSB(Most Significant Bit)를 위해, 3   b i t s 3\ bits wire_type을 저장하기 위해, 마지막 1은 1을 이진수로 변환했을 때 1   b i t s 1\ bits 를 사용하기 때문에 총 5   b i t s 5\ bits 를 사용합니다. 위와 같은 방법으로 16번 필드는 1 + 3 + 5 = 9   b i t s 1+3+5=9\ bits  2   b y t e s 2\ bytes 를 사용합니다.

사용 가능한 가장 작은 숫자는 1이고, 가장 큰 숫자는 2 29 1 2^{29}-1 , 즉, 536 , 870 , 911 536,870,911 까지 사용할 수 있습니다. 또한, 19000 에서 19999 는 예약 번호로, 사용할 수 없습니다.

Field Rules

  • required: 해당 필드는 필수로 받습니다. proto2
  • optional: 해당 필드는 옵션입니다. proto2
  • repeated: 해당 필드가 여러 번 반복됩니다. (배열) proto2 / proto3

Service 정의

위에서 작성한 MessageRPC(Remote Procedure Call) Service Interface를 정의할 수 있습니다. 그리고 Protocol Buffers Compiler가 선택한 언어로 Interface와 Stub을 생성해 줍니다. 예를 들어 SearchRequest를 받아 SearchResponse로 응답하는 메소드는 다음과 같이 정의할 수 있습니다.

service SearchService {
	rpc Search(SearchRequest) returns (SearchResponse);
}
댓글
공지사항
최근에 올라온 글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함