JSON

"JSON (JavaScript Object Notation) is a lightweight data-interchange format."

— 공식 홈페이지 첫 화면을 장식하는 직관적이고 심플한 정체성 정의.

자바스크립트의 문법을 대충 베껴서 세상에 나왔는데, 어느새 온 지구상의 프로그래밍 언어와 프레임워크가 무릎 꿇고 수용하게 된 데이터 표현 표준. XML 시절 꺾쇠 괄호(<>) 닫는 태그 다 적느라 네트워크 패킷 질질 흐르고 타이핑하다 손목 터널 증후군 걸렸던 선배 개발자들에게 묵념을 보낸다.

1. 개요

JSON(JavaScript Object Notation)은 인간이 읽기 쉽고 기계가 파싱하고 생성하기 쉬운 텍스트 기반의 경량 데이터 교환 표준 포맷이다. 이름에 '자바스크립트'가 들어가 있지만, 특정 언어에 종속되지 않고 현대 거의 모든 프로그래밍 언어에서 기본 파서와 빌더를 탑재하고 있다.

키-값(Key-Value) 매핑과 배열(Array)이라는 단순명쾌한 조합으로 복잡한 객체 그래프를 훌륭하게 표현해 낸다. 과거 SOAP과 XML이 지배하던 인터넷 데이터 교환 생태계에 혜성같이 등장하여, 훨씬 얇고 빠며 친숙한 텍스트 구조로 단숨에 천하를 통일했다.(...)

2. XML의 끔찍한 꺾쇠 지옥 극복과 AJAX의 황금기

2.1. XML vs JSON: 뚱뚱함과의 전쟁

과거 2000년대 초반까지만 해도 인터넷에서 데이터를 주고받기 위해서는 XML(eXtensible Markup Language)이 당연한 표준이었다. 하지만 XML은 여는 태그가 있으면 닫는 태그가 무조건 수반되어야 했기에, 알맹이 데이터는 10바이트인데 껍데기 태그가 100바이트에 달하는 낭비가 매우 심했다. 게다가 복잡한 스키마 정의 파일(XSD)과 어마어마하게 길고 무거운 파싱 코드 때문에 브라우저 환경에서 다루기가 무척 고통스러웠다.1

이에 반해 JSON은 중괄호 {}와 대괄호 [], 콜론 :만 있으면 데이터를 군더더기 없이 간결하게 담을 수 있다. 텍스트 용량이 획기적으로 줄어들어 모바일 시대의 제한된 대역폭에서 최적의 속도를 뽐낼 수 있게 되었다.

2.2. AJAX와의 찰떡궁합

웹 페이지 전체를 새로고침 하지 않고 필요한 데이터만 백그라운드에서 동적으로 주고받는 기술인 AJAX의 등장과 함께, JSON은 웹의 주연으로 격상되었다. 자바스크립트 엔진 내부에서 복잡한 변환 라이브러리 없이 JSON.parse() 한 줄만 치면 바로 메모리 상의 네이티브 객체로 뿅 하고 변신하는 환상적인 호환성 덕분에, 사실상 AJAX의 'X(XML)'는 완전히 도태되고 실제론 AJAJ(Asynchronous JavaScript and JSON)로 작동하게 되는 촌극을 빚기도 했다.(...)

3. JSON의 명확한 문법적 제약과 극복

JSON은 뛰어난 장점만큼이나 아주 엄격하고 냉정한 문법적 한계를 가지고 있다.

  1. 엄격한 홀따옴표 금지: 문자열과 키(Key)는 반드시 쌍따옴표(")로만 감싸야 한다. 파이썬이나 자바스크립트 감성으로 홀따옴표(')를 썼다가는 JSONDecodeError의 무자비한 철퇴를 맞는다.
  2. 마지막 콤마(Trailing Comma) 금지: 배열이나 객체의 마지막 항목 뒤에 사소한 콤마(,) 하나를 남겨두면 파서가 에러를 뿜으며 기동을 멈춘다. 많은 개발자가 깃(Git) 변경 내역을 깔끔하게 유지하기 위해 마지막 콤마를 허용하는 JSON5 스펙을 그리워하는 이유다.2
  3. 주석 처리 불가: 공식 표준 스펙상 JSON에는 주석(// 또는 /* */)을 전혀 달 수 없다. 설정 파일로 JSON을 사용할 때 설명글을 적어두고 싶어도 적을 방법이 없어, 꼼수로 "_comment": "이것은 주석입니다" 같은 가짜 키를 집어넣는 눈물겨운 우회법을 쓰기도 한다.

4. Trailing Comma의 눈물과 JSON Parser

4.1. 따옴표 지옥과 JSON.parse()

외부 API로부터 전달받은 알 수 없는 문자열 데이터를 JSON.parse()에 밀어 넣었을 때, 어딘가에 숨겨진 제어 문자나 잘못된 이스케이프 문자 하나 때문에 프로그램 전체가 터져버리는 밈이다. 프론트엔드 개발자들의 안전장치로 항상 try-catch 블록이 필수적으로 사용되는 처참한 현실을 풍자한다.

5. 여담

  • 고안자의 사악한 미소: 더글러스 크락포드가 JSON 표준을 정리해 널리 퍼뜨릴 당시, '악을 행하는 곳에는 사용하지 말 것'이라는 유머러스한 라이선스 조항을 달아두었다. 이 때문에 일부 엄격한 기업(IBM 등) 법무팀에서 '우리는 악당들도 우리 소프트웨어를 쓸 수 있어야 하니 라이선스를 수정해달라'고 심각하게 요청하자 크락포드가 특별히 개별 면제권을 발행해 준 일화가 있다.
  • 타입 시스템의 누락: JSON은 string, number, boolean, null, object, array라는 지극히 기초적인 6가지 타입만 지원한다. '날짜(Date)' 타입이 존재하지 않아, 날짜를 ISO-8601 문자열로 보낼지 유닉스 타임스탬프 숫자로 보낼지 두고 백엔드와 프론트엔드가 격하게 키보드 싸움을 벌이는 주범이 되기도 한다.
  • BSON의 탄생: MongoDB 같은 Document NoSQL 데이터베이스는 내부적으로 이 JSON의 가벼움을 더욱 극대화하고 이진(Binary) 검색 속도를 올리기 위해 JSON을 압축한 BSON(Binary JSON) 포맷을 자체 개발하여 사용하고 있다.

6. 관련 문서

각주

  1. XML 시절에는 데이터를 전송하기 전과 후의 헤더 오버헤드가 엄청나 웹 브라우저의 가냘픈 JS 엔진이 파싱 작업을 감당하다 멈춰버리는 현상이 잦았다.

  2. 그럼에도 더글러스 크락포드는 문법을 최대한 단일화하고 구조를 단순하게 유지해야 다양한 프로그래밍 언어에서 쉽고 안전하게 파서를 구현할 수 있다는 굳은 철학을 끝까지 밀어붙여 이를 표준으로 확정 지었다.