티스토리 뷰
작년에 프로젝트를 하다가 Google의 ProtoBuf라는 것이 있다는 것을 알게 되었는데 이 때는 그냥 넘어가버렸다. 근데 최근 리버싱을 할 때 마다 보이는 것 같아서 이 참에 정리해보게 되었다.
ProtoBuf 란?
전송하기 위한 저장하려고 하는 데이터 구조를 유연하고 효율적으로 작성하고 파싱할 수 있도록 지원하는 자동화된 솔루션이다. Json이나 XML을 생각하면 이해가 쉬워지는데, 이것들과는 조금 다르다. ProtoBuf는 데이터 구조를 .proto라는 파일로 작성하면, 이를 컴파일해서 C++/C#/Python 등의 언어 코드 형태로 변환이 가능하고, 변환된 언어 형태로 모듈까지 지원해서 데이터 구조를 전송하고 받아 읽을 수 있게 Serialize / Deserialize도 해준다.
C언어로 예를 들어 구조체를 정의하고, 이를 소켓을 통해 전송할 수 있게 Serialize(전송할 수 있도록 변환)하고, 변환된 데이터를 받은 후 Deserialize(파싱해서 다시 구조체의 형태로 저장) 하던 과정이 있다면, 이를 직접 코드로 다 작성해야 한다. 하지만 ProtoBuf는 데이터 구조만 정의하면 이 과정은 전부 지원해준다.
설치 방법(https://github.com/protocolbuffers/protobuf)
- Protocol Compiler 설치 : .proto 파일을 언어 코드 형태로 변환하기 위한 컴파일러
- C++로 개발하고자 하는 경우(OS 환경에 맞춰서) : https://github.com/protocolbuffers/protobuf/blob/master/src/README.md
- C++ 이외의 언어로 개발하고자 하는 경우 : https://github.com/protocolbuffers/protobuf/releases(최신 버전), https://repo1.maven.org/maven2/com/google/protobuf/protoc/(이전 버전)
- ProtoBuf Runtime 설치 : 컴파일러로 변환된 언어 코드를 지원하기 위한 모듈
- C++로 개발하고자 하는 경우 : Protocol Compiler 설치의 링크에 설치 과정이 포함되어 있음
- C++ 이외의 언어로 개발하고자 하는 경우 : https://github.com/protocolbuffers/protobuf#protobuf-runtime-installation에서 지원하는 언어의 Source를 클릭 (OS 환경에서 해당 언어를 지원하는지 확인!)
※ Python은 pip install protobuf 를 해도 설치됨
사용방법(https://sites.google.com/site/jnjnote/home/google-protocol-buffers/protocol-buffer-basics-c)
- 데이터 구조를 .proto 파일로 작성
- Protocol Compiler인 protoc를 실행해서 .proto 파일을 특정 언어 코드로 컴파일
- 컴파일된 언어 코드를 include 또는 import
- 컴파일된 코드에서 API를 가져다 사용 (모듈 이름은 url 링크의 The Protocol Buffer API 부분을 보면 됨)
Protocol Format 작성 방법(예제는 github,/com/protocolbuffers/protobuf/example/addressbook.proto)
- package는 데이터 구조의 충돌 방지를 위해 어떤 패키지인지를 나타내기 위해 사용 (C++의 namespace)
- message는 해당 이름의 데이터 구조를 나타냄 (C++의 struct 또는 class)
- enum은 지정된 타입을 열거하기 위해 사용 (C의 enum)
- 필드의 타입으로는 bool, int32, float, double, string 이 있음
- required, optional, repeated는 modifier(수식어)라고 하는데, 해당 필드가 반드시 필요한지와 선택인지 또는 반복되는지를 나타내기 위해 사용함
※ proto3에서 required와 optional은 사라졌다고 함. - default는 값이 지정되지 않은 경우, 기본으로 설정될 타입을 나타냄
- 각 필드의 숫자 값은 필드의 값이 아니고, 고유한 식별 태그로써 사용됨
사용 예제(https://github.com/protocolbuffers/protobuf/tree/master/examples) : 딱히 생각나는게 없으므로, github의 example을 그대로 가져옴...
참고
- protobuf gitgub : https://github.com/protocolbuffers/protobuf
- C++ 언어로 자세히 설명 : https://sites.google.com/site/jnjnote/home/google-protocol-buffers/protocol-buffer-basics-c
- 요약해서 설명 : http://jins-dev.tistory.com/entry/Google-Protobuf-정리-내용-및-사용방법
'Programming > 기타' 카테고리의 다른 글
[git] google gitiles 사용 (0) | 2018.10.04 |
---|