구글에서 만든 언어 및 플랫폼에 중립적이면서 프로토콜 통신, 데이터 저장 등에 대해 직렬화해서 사용할 수 있는 구조.
JSON
- 인간이 읽고 쓸 수 있다.
- 스키마에 대한 정보 없이, 사용할 수 있다.
- 웹 브라우저에 사용하기 좋다.
- XML에 비해 가볍다.
- 표준이 없음.
XML
- 인간이 읽고 쓸 수 있다.
- 스키마에 대한 정보 없이, 사용할 수 있다.
- SOAP등의 표준이 있다.
- xsd, xslt, sax, dom과 같은 좋은 툴이 많다.
Protocol Buffer
- 데이터 압축률이 좋다.
- 정보를 얻기 위해서는 스키마에 대한 정확한 지식이 필요함.
- 처리속도가 빠르다.
- 이진 데이터라서 사람의 눈으로 확인할 수 없다.
장점
- 사용성이 좋음
- 20~100배 빠름
- 모호하지 않음
- schema를 알고 있는 상태가 아니라면 decode하기 어려워 보안에 좋다.
- 프로그램에서 사용 가능한 클래스를 생성해 준다.
- 최대 64MB 크기의 Message까지 지원한다.
- JSON 포멧을 지원한다.
- BSD License 정책으로 무료이다.
단점
- 데이터를 눈으로 확인할 수 없음.
- 표준 프로토콜이 아님.
- Proto 문법을 학습해야 한다.
- Proto 파일의 관리 주체를 정해야 한다.
Proto 파일 예제
protocol buffers는 다양한 프로그래밍 언어를 지원하기 때문에 특정 언어에 종속성이 없는 데이터 타입을 활용. 확장자 명은 .proto이다. 각각의 파일은 하나의 노드에서 다른 노드로 전송되거나 저장될 수 있는 데이터의 명세.
syntax = "proto3";
message Person{
string name = 1;
int32 age = 2;
string team = 3;
}
Proto 문법
- 다 설명할 순 없으니 링크로 대체합니다..
gRPC
- 구글에서 만든 gRPC는 protobuf를 사용해서 통신을 한다. 일반적인 REST와 gRPC의 속도를 비교해 보면 Iteration이 늘어날 때마다 성능에서 큰 차이를 보인다.
- 물론 REST와 gRPC의 속도 차이의 이유가 ProtoBuf 만이지는 않겠지만, ProtoBuf의 Serialization & Deserialization이 큰 영향을 미치는 것은 맞을 것.
- 위 데이터를 JSON과 ProtoBuf 크기를 비교해보면 JSON은 82byte, ProtoBuf는 33byte로 매우 큰 차이를 보이는 것을 확인할 수 있다
ProtoBuf를 사용하는 회사들
- Banksalad, TADA, Medium, Microsoft, Figure, Buzzvil, Skyscanner, Bagelcode, Realtime, Stack, PACE, alfaview, Analytics, Betting Team, BuildSafe etc…
결론
이름이 있는 언어는 대부분 지원한다. 직렬화 속도가 빠르고, 직렬화된 데이터의 크기가 기존 xml, json 보다 빠르다. 데이터가 바이트 형태이므로 직렬화해서 전송하기에 별도의 파싱하는 과정이 필요 없다.
Protocol buffer에 쓰는 스키마 파일인 proto 파일에 대한 사전 지식이 필요. 바이트 형태이기 때문에 사람이 읽기엔 적합하지 않다. proto 파일을 보면 이해할 수는 있으나 스키마 파일을 별도로 관리해야 한다. 사용한다면 proto 파일의 관리 주체가 중요할 것.
서버 의존성..
- server에서 적용이 되야 client도 쓸 수 있음.
- 사실 client가 할 일은 protobuf를 깔고 쓸일 밖에 없다.
- Proto 파일 하나만 있으면 client에서 쓰이는 DTO를 모두 통일 시킬 수 있다. 현재 안드로이드의 DTO와 iOS에 DTO는 옵셔널이 붙은거 안붙은거 등 다른게 많음. 근데 Proto 파일을 서버에서 만들어 줘야하는게 함정
- 현재 스웨거의 명세서에 옵셔널 체크가 제대로 되지 않는 것이 문제. ProtoBuf를 사용하면 스웨거에서 따로 옵셔널 체크를 안해도 되고, 서버와의 DTO에 관한 의사소통 리소스도 줄일 수 있음. (서버에서 만들어 주는 Proto 파일을 사용해서 잘못된 부분이 있으면 서버가 먼저 알 것.)
- 현재 서버와 통신할 때 10MB가 넘는 JSON도 통신한다. 통신 할 때 체감상 동글뱅이가 엄청 오래 도는 느낌.. 사용성에 큰 지장이 있을 것. 통신 시간이 엄청 긴 API만 적용해도 사용성이 매우 나아질 것으로 예상
ProtoBuf
https://github.com/protocolbuffers/protobuf
Spring Protocol Buffer 사용법
Protocol Buffers 로 통신하는 Spring REST API 구현해보기
Protocol Buffers & A Spring Boot Example
Spring REST API with Protocol Buffers | Baeldung
Swift Protocol Buffer
https://github.com/apple/swift-protobuf
Kotlin Protocol Buffer
Protocol Buffer Basics: Kotlin | Protocol Buffers | Google Developers
JS Protocol Buffer
참고
[Protocol Buffer를 파헤쳐보자] Google의 Protocol Buffer 1부
'CS' 카테고리의 다른 글
TDD와 BDD (1) | 2022.05.31 |
---|---|
HTTP multipart/form-data (0) | 2022.05.10 |