Intro
- 직렬화(Serialize) : 객체 상태를 전송 할 수 있는 형식(xml/json/protobuf)으로 변환하는 것을 뜻함.
- 역직렬화(Deserialize) : 표현 형식(xml/json/protobuf)에서 객체 상태로 변환하는 것을 뜻함.
JSON/XML vs Protobuf
xml
<velog>
<title>Article</name>
<type>xml</type>
</velog>
- 사람이 읽기/편집 가능.
- 스키마를 미리 알지 않고도 구문 분석 가능.
- SOAP 등의 표준.
- 좋은 도구 지원(xsd, xslt, sax, dom 등).
JSON
velog : {
title : "Article",
type : "json",
}
- 사람이 읽기/편집 가능.
- 스키마를 미리 알지 않고도 구문 분석 가능.
- 뛰어난 브라우저 지원.
- XML보다 보기 편함.
Protobuf
message velog {
required string title = "Article";
optional string type = "protobuf";
}
- 매우 조밀한 데이터(small output).
- 스키마를 모르면 강력하게 디코딩하기 어려움.
- 데이터 형식은 내부적으로 모호하며 명확히 하기 위해 스키마가 필요함.
- 처리 속도가 매우 빠름.
- 사람이 보기 불편함.
Protobuf가 json/xml보다 좋은 점
- Protobuf 형식은 json/xml에 비해 데이터 구조를 표현하는 데 더 작고 빠름.
- Protobuf는 구문 분석을 효율적이고 단순화한 스키마를 사전에 정의하여 사용.
- json/xml은 문자열로 데이터를 교환한 다음 파서를 사용하여 검색하는 동안 이를 구문 분석.
- 처리 및 메모리 소비 측면에서 비용이 많이 들 수 있음.
- json 문자열, 배열 및 객체를 구문 분석하려면 순차 스캔이 필요. 즉, 본문 헤더에 대한 요소 크기나 갯수가 정해 져있지 않음. 다중 계층 구조 문서인 xml도 마찬가지.
근데 왜 아직도 json/xml을 사용할까
- xml/json에 비해 protobuf의 러닝커브가 높음.
- json/xml은 사람이 읽을 수 있고 편집할 수 있는 형식.
- 웹 브라우저에 사용되는 어플리케이션은 protobuf가 적합하지 않음.
- 웹 서비스가 데이터 모델을 protobuf에 연결할 준비가 되지 않은 경우는 별로 쓸모가 없음.
언제 Protobuf를 사용을 고려할까
- 웹 서비스 간 통신에 사용하는 것을 고려.
- 데이터의 크기가 MB 단위 정도 되며 혼합 유형의 데이터가 있는 경우.
- protobuf는 xml/json에 비해 인코딩 및 디코딩 속도가 더 빠르기 때문에 성능 측면에서 도움됨.
- 데이터가 GB 단위로 큰 경우 protobug/json/xml 중 어떤걸 선택해도 압축을 하는게 도움이 됨. 하지만 이러한 경우에도 gzip으로 압축된 protobuf가 확실히 더 좋음.
- 이중 디코딩이 필요한 경우 protobuf는 JSON보다 훨씬 빠른 것으로 입증됨.
- 웹 서비스가 기존 REST 프레임워크 대신 gRpc를 사용하도록 전환된 경우 protobuf사용 권장.
한 줄평 : 일반적으로 서버간의 통신에서는 protobuf를 사용하는 걸 고려해야할지 싶다.
참고 -
https://sprinkle-twinkles.medium.com/what-is-protobuf-and-when-to-consider-it-over-xml-json-for-web-services-communication-d91158b57d4a
https://stackoverflow.com/questions/14028293/google-protocol-buffers-vs-json-vs-xml