구글 프로토콜 버퍼(Google protocol buffers)
단순히 protobuf 또는 pb라고 부르는 구글 프로토콜 버퍼는 데이터 직렬화를 위한 오픈 소스 데이터 구조(Data structure)입니다.
Protocol Buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.
프로토콜 버퍼는 구조화된 데이터를 직렬화하기 위한 언어 중립적, 플랫폼 중립적인 확장 가능 메커니즘입니다.
구조적인 데이터란 XML JSON과 같은 포멧의 데이터를 의미합니다.
PB는 고전적인 구조적 데이터에 비해 더 빠르고, 더 가벼우면서도 다양한 언어에서 사용 할 수 있다는 장점이 있습니다.
더 간결하게 사용할 수 있습니다.3~10배더 작습니다.20~100배더 빠릅니다.- 독립적 구성이 가능해
여러 언어 및 플랫폼과 호환됩니다.
반면, 본질적으로 바이너리 포멧이라는 점에서 단점 역시 갖고 있습니다.
HTML과 호환성이 낮습니다.Human readable특성이 약합니다.- XML이 자기 완결성을 갖는 것과 달리
.proto파일을 참고하지 않으면 데이터 포멧을 이해하기 어렵습니다.
PB의 동작 방식
PB를 사용하려면 가장 먼저 .proto 확장자의 파일을 생성합니다.
.proto 파일을 작성하는 것은 PB 메시지 타입을 정의하며 직렬화하려는 정보를 프로그래밍적으로 지정하는 과정(참고: Protocol Buffer Documentation: Programing Guides)입니다.
message Person
{
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
.proto 파일을 컴파일하면 Builder 패턴을 사용하여 인스턴스를 생성하고 사용 할 수 있습니다.
다음은 Java 환경에서 PB를 사용하여 인스턴스를 생성하는 예시입니다.
Person john = Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.build();
output = new FileOutputStream(args[0]);
john.writeTo(output);
지원하는 언어
PB는 Polyglot을 지향합니다. 다음은 protoc 프로토콜 버퍼 컴파일러에서 직접 지원하는 언어입니다.
일부 언어의 경우 GitHub 리포지토리에서 제공하는 전용 Plugin을 사용해야 합니다.
프로젝트에서 PB 사용을 위한 세 가지 옵션
프로젝트에서 PB를 사용하겠다고 결정했다면, 다음 세 가지 옵션 중 하나를 선택해야 합니다.
Proto2
: 이전 버전의 PB입니다. 지원하는 언어가 한정적이고 최신 버전과 문법에 차이가 있습니다.Proto3
: Proto2에서 확장된 최신 버전의 PB입니다.gRPC
: Proto3 기반의 고성능, 오픈소스RPC(Remote Procedure Call)프레임워크입니다. 여러 서비스 간 연결 및 상호 운용을 도와줍니다.
정리 및 복습
구글 프로토콜 버퍼(Google protocol buffers)는 데이터 직렬화를 위한데이터 구조(Data structure)입니다.- 간단히
protobuf또는pb라고 부릅니다. - 여러 언어와 호환되는
Polyglot의 특징을 갖습니다. XMLJSON과 같은 구조화된 데이터보다 더 가볍고, 빠르게 직렬화 할 수 있습니다..proto확장자 파일에서 데이터 구조를 정의하며 이를 전용 컴파일러protoc로 컴파일하여 사용합니다.- 빌드 결과로 바이너리 포멧이 생성되기에
사람이 이해하기 더 어렵고 HTML 호환성이 낮다는 단점이 있습니다. - PB는
Proto2Proto3gRPC로 구분되며 Proto2는 구버전이므로 권장되지 않습니다.