프로그래밍/기타

프로토콜 버퍼

Jay_rock 2022. 8. 12. 16:29

프로토콜 버퍼(Protocol Buffers, protobuf)란?

프로토콜 버퍼는 구글에서 구조화된 데이터를 직렬화하기 위해 공개한 오픈소스 언어이다. 줄여서 protobuf 혹은 pd라고 부르며, Java, Python, Objective-C 및 C++ 등 다양한 언어를 지원한다. 직렬화란 데이터를 파일로 저장하거나 네트워크 통신에 사용하기 위한 형식인 바이트 스트림 형태로 변환하는 것이다.

 

json과 protobuf

비슷한 데이터 형식으로 json이 있다. 보통 데이터를 교환할때 json 형태를 많이 사용하지만 프로토콜 버퍼를 이용하는 이유는 처리 속도가 빠르고 직렬화된 파일의 크기도 월등히 줄일 수 있어, 대용량 데이터 처리에 용이하다. 그 대신 바이너리 데이터로 표현되기 때문에 사람이 직접 확인하기 어렵다. 

 

 

프로토콜 버퍼의 작동 방식

protocol buffer workflow

프로토콜 버퍼에 의해 생성된 코드는 파일이나 스트림에서 데이터를 검색하고, 데이터에서 개별 값을 추출하고, 데이터가 존재하는지 확인하고, 데이터를 파일 또는 스트림으로 다시 직렬화하는 유틸리티 메서드 및 기타 유용한 기능을 제공한다.

 

 

사용 방법 

c++을 이용 주소록 응용 프로그램을 정의해봤다.

syntax = "proto2";
package tutorial;

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

우선 코드를 살펴보면 패키지를 선언하여 다른 프로젝트 간의 충동을 방지한다. C++에서 생성된 클래스는 패키지 이름과 일치하는 네임스페이스에 배치된다.

 

다음은 메시지 정의이다. 메시지는 bool, int32, float, double, string 등과 같은 타입이 지정된 필드의 집합이다. 더 나아가 다른 메시지 유형도 필드 유형으로 추가할 수 있다. 예를 들어 Person message 안에는 PhoneNumber message가 포함되어 있고, AddressBook message에는 Person message가 포함되어 있다. 또한 enum 필드를 사용하여 미리 정의된 유형을 사용할 수도 있다. 각 요소의 필드에 " =1 "과 같은 마커는 바이너리 인코딩에서 고유한 태그로 사용한다. 

 

각 필드는 항상 앞에 modifier를 달아야 한다. 필드 앞에 사용되는 modifier는 총 세 가지가 있다.

1. optional : 이 필드의 경우 필드 값이 설정되거나 설정되지 않을 수도 있다. 만약 필드에 값이 설정되지 않은 경우 고유한 기본값이나 시스템 기본값이 사용된다. 숫자, 문자열, 부울의 Default 값은 0, 빈 문자열, false이다.   

2. repeated : 여러 번 반복하여 사용할 수 있는 필드입니다. 반복되는 값의 순서는 프로토콜 버퍼에 유지하며 동적으로 크기가 조정된 배열이 된다.

3. required : 이 필드는 필드명과 같이 필드 값을 항상 입력되야 한다. 만약 입력이 되지 않는다면 초기화되지 않은 것으로 간주되어 에러가 발생한다.

 

프로토콜 버퍼 컴파일

  1. 컴파일러를 설치하지 않은 경우 패키지를 다운로드한다.
  2. 컴파일러를 실행하여 소스 디렉토리를 지정한다.
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/custom.proto

C++ 클래스를 원하기 때문에 --cpp_out옵션을 사용한다. ( 다른 언어에 대해서도 유사한 옵션이 제공된다.)

 

그러면 지정된 대상 디렉토리에 다음 파일이 생성된다.

  • custom.pb.h     //  헤더를 선언
  • custom.pb.cc      //  클래스 구현

'프로그래밍 > 기타' 카테고리의 다른 글

kochat을 활용한 closed domain 챗봇 구현 과정  (0) 2022.03.18