JSON is Slower. Here Are Its 4 Faster Alternatives
DEV Community
JSON 은 데이터를 정의하는 포맷중 하나로 웹 서비스에서 서버와 클라이언트간에 통신시 많이 사용되고 있습니다.
제가 신입일때까지만 해도 XML 이나 Plain Text 형식으로 통신하는 API 들도 여럿 있었지만,
시간이 흘러 이러한 API 들은 deprecated 되었고
현재 서비스 되고 있는 OPEN API 들의 문서를 봐도 JSON 으로 통신하지 않는 API 는 찾아보기가 힘듭니다.
JSON 이 이렇게 인기가 많아진 이유는 다음과 같습니다.
📌 사람이 읽을 수 있는 형식
📌 언어에 구애받지 않음
📌 데이터 구조 일관성
📌 브라우저 지원
📌 프로그래밍 언어의 JSON API 지원
그렇지만 이러한 JSON 도 다음과 같은 이유로 성능 저하를 발생시킬 수 있습니다.
📌 광범위하거나 중첩이 깊은 데이터일 경우 Parsing 오버헤드가 발생할 수 있습니다
📌 데이터 송수신시 반드시 해야하는 직렬화 및 역직렬화 과정이 성능에 영향을 줄 수 있습니다
📌 JSON 은 텍스트 기반이기 때문에 문자열 처리를 하게 되는데 이는 이진 데이터 처리에 비해 느릴 수 밖에 없습니다
📌 JSON 에서 제공하는 데이터 Type 이 제한되기 때문에 복잡한 데이터 구조를 사용할 경우 추가적인 장치나 표현이 필요하게 되어 성능에 영향을 줄 수 있습니다
📌 바이너리 데이터에 대한 지원이 없기 때문에 이를 표현할 경우 텍스트 인코딩, 디코딩을 하게 되어 성능에 영향을 줄 수 있습니다
이러한 JSON 의 단점을 대체할 수 있는 것으로 다음과 같은 솔루션이 있습니다.
📌 Protocol Buffers
Protobuf 라고도 알려진 프로토콜 버퍼는 Google 에서 개발한 바이너리 직렬화 형식입니다.
JSON 에 비해 인코딩 및 디코딩이 더 간단하고 빠른 바이너리 인코딩을 사용하고 이전 버전과의 호환성을 유지하면서 데이터 구조를 업데이트할 수 있는 Schema Evolution 을 지원합니다.
📌 MessagePack
MessagePack 은 효율성과 속도를 위해 설계된 또 다른 이진 직렬화 형식입니다.
매우 컴팩트한 데이터 표현을 생성하여 데이터 전송 크기를 줄일 수 있고, Protocol Buffers 와 동일하게 바이너리 특성으로 빠른 인코딩 및 디코딩이 가능합니다.
📌 BSON
MongoDB 에서 사용하는것으로 유명한 BSON 은 바이너리 데이터 유형이 추가된 JSON과 유사한 구조를 유지하여 효율성과 가독성 간의 균형을 제공합니다.
또한 이미지나 멀티미디어와 같은 데이터를 처리하는 데 유용한 바이너리 데이터 유형에 대한 기본 지원을 제공합니다.
📌 Avro
Avro는 Apache Hadoop 프로젝트 내에서 개발된 데이터 직렬화 프레임워크로 스키마 호환성과 성능에 강점을 두고 있습니다.
컴팩트 바이너리 인코딩 형식을 사용하므로 페이로드를 줄일 수 있고 여러 프로그래밍 언어를 지원하므로 다양한 애플리케이션 생태계에 적합합니다.
공유 드린 원문에 이에 대한 자세한 내용과 JSON 을 계속 사용할 경우 성능을 최적화 할 수 있는 팁들이 정리되어있으니 관심있으신 분들은 원문 내용을 참고해주세요.
📚 원문
https://dev.to/nikl/json-is-slower-here-are-its-4-faster-alternatives-2g30?utm_source=oneoneone
다음 내용이 궁금하다면?
이미 회원이신가요?
2023년 11월 17일 오전 8:11
네이버에서 서비스하는 api 중에서 위에서 말씀하신 json 대안을 제공하는 것이 있나요? 네이버 api를 사용할 때, 익숙해서 json으로 사용하기는하는데 혹시 제공되면 이후에 사용할 때는 상황에 맞게 사용해봐야겠습니다
@안건영 안녕하세요! 네이버 OPEN API 가이드(https://developers.naver.com/docs/common/openapiguide/) 에 정리된 서비스 API 를 봤을때 JSON 외에 다른 프로토콜이나 포맷을 지원하는 곳은 없어보이네요 🥲
뒷단 내부에서는 grpc를 통해 개발하고 있습니다. 도입 당시 부하 테스트에서 분명 차이를 보고 도입했지만 정작 개발 및 운영하면서는 드라마틱한 차이는 못 느끼고 있습니다. 규모가 큰 회사에서 부분 부분 내부 통신용으로 쓰면 참 좋은 것 같습니다. 아 물론 외부에 제공되는 api는 말씀대로 restful api로 제공해야 됩니다...