Computer Science/Tech

[Tech] Protocol Buffer: Serialization에 관하여, 모두가 JSON을 쓴다고 하여 JSON만이 정답일까?

ooeunz 2020. 1. 11. 17:28
반응형

이 포스팅은 우연히 google cloud api를 사용하던 중 response 객체가 json 타입이 아니라는 사실을 알게 되면서, '왜 당연하듯 모두가 json객체를 사용하는가?'라는 의문에서부터 시작된 공부이다. 이 블로그의 모든 포스팅이 그러하듯 먼저 Serialization(직렬화)가 무엇인지부터 시작해보도록 하겠다.


 

Serialization란?

직렬화란 시스템 내부에서 사용하는 객체를 다른 시스템에서도 사용할 수 있도록 바이트(byte)형태로 데이터를 변환하는 기술을 뜻한다. (반대로 다시 객체 형태로 변환하는 기술은 역직렬화라고 부른다.) 이를테면 Java에서 사용하던 객체 방식과 ruby on rails나 Node.js에서는 형식이 다를 수 있기 때문에 모두가 같은 데이터를 사용할 수 있도록 공통화 작업이라고 생각하면 이해가 빠르겠다.

 

※ 시스템적으로 생각해보자면, JVM의 힙 또는 스택 메모리에 상주하고 있는 객체 데이터를 바이트 형태로 변환하는 기술을 뜻한다.

 


우리가 흔히 사용하는 문자열 형태의 직렬화

범용적인 API나 데이터를 변환하여 추출할 때 주로 많이 사용되는 형태이다. 표 형태의 다량의 데이터를 직렬화시에는 CSV를 많이 사용하고, (Node.js 카테고리에서 조짜기 프로젝트에서 CSV형식을 사용했다.) 구조적인 데이터는 이전에는 XML을 많이 사용했으나 최근에는 JSON 형태를 주로 사용하고 있다.

 

JSON 포맷은 JavaScript Object Notation의 줄임말로써 그 이름에서 알 수 있듯이 자바스크립트 Object 표현 방식이다. 다른 데이터 포맷 방식에 비해 오버헤드가 적고 휴대하기 간편하기 때문에 인기가 많고, 위에서 언급했듯 대부분의 api에서 json타입을 허용하고 있기 때문에 필자 역시 당연히 JSON 타입의 직렬화를 사용했다. JSON의 장점은 아래와 같다.

 

 

JSON 장점

  1. Readable 텍스트 형태이기 때문에 쉽게 읽을 수 있으며, 때문에 언제든 텍스트 뷰어로 객체를 열어서 검사할 수 있다. 
  2. Self-Contained JSON은 그 자체로 모든 것을 포함하고 있기 때문에 무언가를 동기화하지 않고, json을 보내고 받아들이는 것 만으로 손쉽게 사용 가능하다.
  3. Extensible JSON객체는 클라이언트에게 특별한 변화 없이 저장하는 데이터를 쉽게 확장할 수 있다.

 

하지만 JSON은 장점만을 가지고 있지 않다.

 

 

JSON 단점

  1. Expensizve 대량의 데이터 직렬화시 많은 비용이 발생한다. 또한 역직렬화 객체 역시 상당한 오버헤드를 무시할 수 없다.
  2. Has uclear types 많은 부분에서 JSON을 사용하고 있지만, 모든 분야에서 JSON 타입이 반드시 옳지만은 않다. 예를 들면 JSON은 숫자에 관하여 불가지론적이다. 따라서 부호 없는 32비트 정수를 저장할 수 없다. 
  3. Massive 마지막으로 데이터의 양이 JSON은 방대하여 많은 오버 헤드가 발생한다.

 

이러한 대안으로 이진 직렬화를 하는 방법이 있다. 데이터 변환 및 전송 속도에 최적화하는 것으로, 직렬화뿐만 아니라 전송 방법에 대한 부분에도 차이점이 있지만, 해당 포스팅에서는 직렬화에 관한 부분만 다뤄보도록 하겠다.

 

대표적인 것으로 구글에서 제안한 데이터 직렬화 플랫폼인 Protocol Buffer가 있다.

 


Protocol Buffer

Protocol buffer, 이하 protobuf는 모든 데이터와 함께 스키마를 미리 선언하여 공간과 비용을 아낄 수 있다. 비워져 있는 스키마를 가지고 있는 프로토파일은 실제로 우리가 필요로하는 데이터를 그 안에 채워넣어 protobuf에서 코드를 할당한다. protobuf는 바이너리 형태이기 때문에 휴대하기 간편하고 효율적으로 메세지 교환을 할 수 있다.

 

 

 

그럼 JSON과 Protocol Buffer 중 어떤 것을 사용하는 것이 좋을까?

언제나 그렇듯 정해진 정답은 없다. 목적에 따라 적절히 선택하는 것이 가장 올바른 방법일 것이다. 위의 특성에서도 알 수 있듯이 데이터 크기가 작고 검사가 필요하고,  확장성이 필요하거나 다양한 형태의 데이터가 필요하다면 JSON이 더 좋다.

 

하지만 데이터의 크기가 크고 비슷한 유형의 데이터가 많으며, 성능이 정말 중요한 경우라면 protobuf가 더 나은 선택이라고 볼 수 있다.

 

대체로 많은 서비스에서 클라이언트로 전송해야 하는 데이터의 경우 JSON을 사용하고 service와 service가 통신하는 경우라면 protobuf를 사용하는 경우가 많으니, 진행하는 프로젝트의 특성을 고려하여 선택할 수 있길 바란다.

반응형