Smile / CBOR은 대체 무엇인가?
JSON(JavaScript Object Notation)은 많은 분이 알고 있듯, XML보다 덜 장황하고, 범용성과 가독성이 높은 데이터 포맷이다. (데이터 자체의 가독성)
하지만 여전히 텍스트 기반의 데이터 포맷이라는 점은 변하지 않아서, 내부 전송 형식으로 JSON을 사용하게 되면 심각한 자원 낭비가 발생한다.
이를 대체하기 위해 나온 것들이 BSON, MsgPack, CBOR, Smile, Protobuf, ION, Kyro 등의 이진 데이터 포맷이다.
- CBOR은 JSON의 이진 형식 버전이다.
- Smile은 Jackson (자바에서 JSON/XML/...etc 처리할 때 쓰는 라이브러리) JSON 프로세서 개발팀이 2010년에 내놓은 이진 데이터 포맷이다.
Smile / CBOR을 사용하게 된 이유
노래하는하리보
는 서버 간 통신에 JSON을 사용했었다.
이용 유저 수가 적을 때는 문제가 나타나지 않았으나,
이용 유저 수가 많아지며 낭비되는 자원 또한 덩달아 많아졌다는 것을 확인하게 되었다.
이를 해결하기 위해 gRPC
+ Protobuf
나 Kyro
로 변경하려 했으나
기존 코드를 전부 갈아엎어야 하는 문제가 있어,
코드 변경을 최소화할 수 있는 데이터 포맷을 찾아보았다.
하지만 BSON
은 설계가 지나치게 장황했고 (+ JSON과 1대1 호환 불가), MsgPack
은 이진 데이터와 텍스트 문자열을 구분할 수 없는 이슈가 있어, CBOR
과 Smile
을 선택하게 되었다.
적용 방법 - Jackson, gradle 기준
서버에서 Jackson
을 쓰고 있던 터라, 코드를 쉽게 수정했던 것 같다.
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-cbor', version: '2.12.2' // Jackson version
implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-smile', version: '2.12.2' // Jackson version
위에 적어놓은 대로 라이브러리를 추가하고,
JsonMapper
를CBORMapper
또는SmileMapper
로 변경writeValueAsString
을writeValueAsBytes
로 변경
위 작업만 해주면 끝이다.
(물론 부가적인 요소(텍스트 전용 처리라던지)는 제외했다)
결론
노래하는하리보
는 Smile
을 주로 사용하고 있는데, JSON
사용할 때와 비교하여 트래픽이 10% 이상 줄어들었다.
반복적인 데이터를 자주 보내는 경우 Smile
이 더욱 효과적일 것으로 보인다. (반복되는 key/value에는 참조를 사용하기 때문에, 반복되는 형태의 데이터에 더욱더 강하다)
'개발' 카테고리의 다른 글
ZGC를 프로덕션에 적용해보자! (GC 튜닝 & STW & 최적화) (0) | 2021.12.12 |
---|---|
자바 GC (JVM GC) 최적화하기 (0) | 2021.10.06 |
손쉽게 PHP 네이티브 확장 개발하기 (Zephir) (0) | 2020.12.22 |
[BOJ] [CodeUp.kr] 카드 역배치 (10804번, 4841번) (0) | 2019.06.22 |
[CodeUp.kr] 3020번 기억력 테스트 4 (0) | 2019.06.22 |