프로토콜 버퍼는 XML, JSON과 같은 직렬화 데이터 구조 이다. 여기서 직렬화 데이터 구조의 예시를 잠깐 들면,
hello를 ‘문자열 직렬화’ 할 경우 8(h) 65(e) 6C(l) 6C(l) 6F(o) 로 표현되고,
어떤 객체를 ‘JSON 포맷 직렬화’ 할 경우 {‘something’ : ‘something value’} 처럼 표현될 수 있다.
이처럼 프로토콜 버퍼는 데이터를 표현하는 구조 라고 이해할 수 있겠다.
JSON 포맷과 비교하여 이해를 하면,
//Person Class object JSON 포맷화
{
"userName":"Martin",
"favouriteNumber":1337,
"interests":["daydreaming","hacking"]
}
데이터의 크기가 얼핏 잡아도 80byte가 넘는다. 근데 같은 데이터를 프로토콜 버퍼를 이용하여 나타낸다면?
message Person{
required string user_name = 1;
optional int64 favourite_number = 2;
repeated string interests = 3;
}
위 코드는 프로토콜 버퍼 데이터 타입으로 작성된 .proto 파일이다. JSON 포맷과 다른점은 불필요한 속성 값들이 1, 2, 3 으로 대체 됐다.
그림을 보면 데이터의 첫 바이트를 5bit. 3bit로 나눴는데 5bit에는 대체된 번호 ( 1, 2, 3 )를 나타내고 있고 3bit에는 데이터 타입을 표현한다. ( 010 은 string ) 그리고 다음 바이트에는 이어지는 데이터의 길이를 나타내준다. 이와 같은 원리로 33byte에 80byte가 넘는 데이터를 표현 가능한 것이다.
데이터의 크기가 작기 때문에 빠르다. 그리고 JSON 포맷과 다르게 프로토콜 버퍼를 사용하게 되면 바이트가 오기 때문에 별도의 파싱이 필요없이 메모리에 저장할 수 있다. 결론은 빠르다.
JSON은 사람이 읽기에 편하지만, 프로토콜 버퍼는 .proto파일이 없다면 데이터를 이해 할 수 없다.
https://github.com/google/protobuf/releases
이곳에서 자신이 필요한 프로토콜 버퍼를 다운 받는다.brew install autoconf && brew install automake
1번에서 다운받은 protobuf 폴더에 들어가서 ./autogen.sh && ./configure &&. make
( 오래 걸린다 )
$ make check
$ sudo make install
$ which protoc
$ protoc --version
https://medium.com/@erika_dike/installing-the-protobuf-compiler-on-a-mac-a0d397af46b8