직렬화(serialization)은 어떠한 데이터 구조를 송/수신하거나 저장하기 위해 전송에 적합한 포맷으로 변환하는 과정이다. 대부분의 서비스에는 통신이 필요하고, 어떤 프로토콜을 쓰던 간에 컴포넌트 간 데이터 통신(안드로이드 앱 → Python 서버 등)을 위해서는 프로그래밍 언어나 플랫폼에 독립적인, 표준화된 포맷이 필요하다.(Java의 객체를 이런저런 방식으로 바이너리로 변환해 봤자, 다른 언어에는 이에 대한 표준이 없어서 완벽하게 읽을 수 없기 때문에) 따라서 직렬화는 컴퓨터 과학에서 매우 중요하다. 여기서는 데이터를 송/수신하기 위한 직렬화에 대해 이야기해 보겠다.

웬만한 서비스에서 대부분의 데이터는 'ID는 planb고, 나이는 19세다'처럼 a는 b같은 map 개념과 '학생 목록'처럼 학생1, 학생2, 학생3, ...같은 list 개념만 있으면 대충 다 표현할 수 있다. 예를 들어, '학생들의 주소록'은 '이름', '주소', '전화번호' 등이 담긴 각각의 요소를 list로 묶어주면 된다. 결론적으로 map과 list를 어떤 모습으로 표현할 것인지, 요소들에는 어떤 타입을 허용할지에 따라 수많은 형태의 직렬화 양식이 존재한다.

위부터 차례대로 json, xml, yaml이다. 이들 중 데이터의 송/수신에서 가장 많이 쓰이는 것은 (아마도)JSON이다.

JSON

JSON은 JavaScript Object Notation의 약자이며, 따라서 JavaScript의 객체를 표현하기 위한 포맷에서 파생되었다. key-value 쌍으로 이루어진 object 타입과, 값들의 순서화된 열거인 array 타입으로 나뉜다.

Object

Object는 Python의 Dictionary, Java의 HashMap과 대응할 수 있으며, 비순서화된 key-value 쌍으로 이루어진다. 한 object에서 key는 항상 유일성이 보장되며, 따라서 각각의 요소들을 key로 식별한다. 중괄호로 감싸고, key와 value의 구분자로 colon(:)을 사용하고, comma(,)로 각 쌍을 구분한다.

Array

Array는 Python의 List, Java의 ArrayList와 대응할 수 있으며, 값(value)의 순서화된 열거를 표현한다. 대괄호로 감싼다.

value

사실상 특정 언어에서 JSON이라는 데이터를 직렬화/역직렬화하기 위한 패키지를 개발하려면, 위에서 이야기한 format에 대한 정의와 함께 value의 정의도 필요하다. 문자열(string), 숫자(number), JSON object, JSON array, boolean 타입 또는 null이 올 수 있다.

결론적으로,

  • A와 B가 통신하려면 특정 프로그래밍 언어에 의존하지 않는 데이터 포맷이 아무튼 필요하다.
  • 이를 위해 많은 사람들이 직렬화 포맷들을 이것저것 제안했으나 결국은 JSON이 가장 많이 쓰인다.
  • 콤마로 구분된 key-value 매핑을 중괄호로 감싸고, 이를 'object'라고 부르며
  • 요소의 열거를 표현하기 위해 콤마로 구분된 값들을 대괄호로 감싸고, 이를 'array'라고 부른다.
  • 이 둘을 통해 열심히 데이터를 만들어서 송/수신하면, 대부분의 프로그래밍 언어가 JSON 파싱을 지원하기 때문에 알아서 잘 파싱해서 쓸 수 있다.
  • 따라서 클라이언트가 서버로 데이터를 쏠 때나, 서버가 클라이언트로 데이터를 내려줄 때나 웬만하면 JSON을 사용하는 것 같다.


'배경지식' 카테고리의 다른 글

ProxySQL  (1) 2019.02.12
ORM  (0) 2019.02.12
HTTP 메소드  (0) 2019.02.12
StatsD  (0) 2019.02.11
HTTP 헤더  (0) 2018.11.02

+ Recent posts