본문 바로가기

개발

프로덕션 서버에 JSON 대신 Smile / CBOR 적용

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 + ProtobufKyro로 변경하려 했으나
기존 코드를 전부 갈아엎어야 하는 문제가 있어,

코드 변경을 최소화할 수 있는 데이터 포맷을 찾아보았다.

하지만 BSON은 설계가 지나치게 장황했고 (+ JSON과 1대1 호환 불가), MsgPack이진 데이터와 텍스트 문자열을 구분할 수 없는 이슈가 있어, CBORSmile을 선택하게 되었다.

적용 방법 - 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

위에 적어놓은 대로 라이브러리를 추가하고,

  • JsonMapperCBORMapper 또는 SmileMapper로 변경
  • writeValueAsStringwriteValueAsBytes로 변경

위 작업만 해주면 끝이다.
(물론 부가적인 요소(텍스트 전용 처리라던지)는 제외했다)

결론

노래하는하리보Smile을 주로 사용하고 있는데, JSON 사용할 때와 비교하여 트래픽이 10% 이상 줄어들었다.

반복적인 데이터를 자주 보내는 경우 Smile이 더욱 효과적일 것으로 보인다. (반복되는 key/value에는 참조를 사용하기 때문에, 반복되는 형태의 데이터에 더욱더 강하다)