본문 바로가기

etc

protocol buffer 정리

protocol buffer

 

Protocol Buffers is a free and open source cross-platform library used to serialize structured data

https://en.wikipedia.org/wiki/Protocol_Buffers

데이터를 직렬화할 때 사용하는 오픈소스 라이브러리이다.

 

 

 

메시지 타입 정의

 

search request에 대한 예제 .proto 파일 

syntax = "proto3";


message SearchRequest {

  string query = 1;

  int32 page_number = 2;

  int32 result_per_page = 3;

}

 

- SearchRequest라는 이름의 message를 정의

- message는 데이터를 나타내는 필드를 다음과 같이 작성한다.

                 Type Name = Unique Number;

- 여기서 Unique Number는 이진 형식의 필드를 식별하는 데 사용되며 사용중일때 변경하면 안됨

- Unique Number 1-15 값은 1바이트를 사용, 16-2047 값은 2바이트를 사용

   * https://developers.google.com/protocol-buffers/docs/encoding#structure 자세한 인코딩 내용 참고

 

 

필드 rule

- 메시지 필드는 2개의 rule을 가지게 됨

  • singular: (default) 해당 필드를 0개, 1개만 가질 수 있음
  • repeated: 해당 필드를 여러번 반복할 수 있다.

: repeated는 언제쓰이는걸까..?

 

 

예약 필드

- 필드 넘버나 이름을 지정하여 예약할 수 있음

- 이전에 Unique Number가 사용중일때는 변경하면 안된다고 했다. 따라서 proto 파일을 통해 새로 나만의 메시지를 만들거나 할 때 reserved field를 사용하면됨

 

예시

message Foo {

  reserved 2, 15, 9 to 11;

  reserved "foo", "bar";

}

 

compile .proto 

 

protocol buffer compiler를 통해 .proto 파일을 컴파일 하게되면 선택한 언어로 코드를 생성하는데 다음을 포함한다.

- getting, setting field values

- serializing messages to an output stream

- parsing messsages from an input stream

 

예시 (go)

syntax = "proto3";

package pb;

option go_package = "pb/;pb";


service Vault {

    rpc Hash(HashRequest) returns (HashResponse) {}

    rpc Validate(ValidateRequest) returns (ValidateResponse) {}

}


message HashRequest {

    string password = 1;

}

message HashResponse {

    string hash = 1;

    string err = 2;

}

message ValidateRequest {

    string password = 1;

    string hash = 2;

}

message ValidateResponse {

    bool valid = 1;

}

 

 

다음과 같이 .proto 파일로 메시지 및 서비스를 정의하고,

protoc --go_out=. --go-grpc_out=. --go-grpc_opt=paths=source_relative pb/vault.proto

다음과 같이 compile을 진행해주면...

 

protobuf compile 결과물

다음과 같이 2개의 go 파일 (코드)가 생성되고, 직접 활용할 수 있다.

 

 


1/3 정도 정리했다.. 꽤나 내용이 많아서 차근차근 정리하겠다.

 

 

** reference : https://developers.google.com/protocol-buffers/docs/proto3

'etc' 카테고리의 다른 글

[gRPC] gRPC 간단 정리  (0) 2021.08.03