제이슨
제이슨(JSON)은 JavaScript Object Notation의 약자로서, 자바스크립트(JavaScript) 토대로 개발되었다.
목차
개요
여러 프로그래밍 언어에도 사용할 수 있어 독립형 언어이며 텍스트로 기술하여 사람도 쉽게 읽고 작성할 수 있다. 웹 브라우저와 웹 서버 간 비동기 통신, 웹 서버 간의 데이터 교환 등에 주로 사용된다. IETF RFC 7159(The JavaScript Object Notation(JSON) Data Interchange Format) 표준과 ECMA-404(The JSON Data Interchange Syntax) 표준으로 제정되어 있다.
JSON은 자바스크립트(ECMA-262 3rd edition, 1999)를 토대로 개발되었으며, 2000년대 미국의 컴퓨터 프로그램 개발자인 더글라스 크락포드(Douglas Crockford)가 확산시켰다. 특히, 웹 브라우저에서 비동기 처리에 사용되는 에이잭스(AJAX)가 데이터 교환 형식으로 JSON을 사용하면서 널리 알려졌다. AJAX가 기존 사용하던 XML 기반의 메시지 포맷은 시작 태그와 끝 태그를 포함하여 메시지 크기가 커지는 문제가 있었다. 이를 해결하기 위해 JSON으로 대체하였다. 대부분의 웹 기반 애플리케이션에서 데이터 교환 형식으로 XML 대신 JSON을 활용한다.[1]
등장 배경
- 1997년 동적인 HTML : 동적으로 변하는 컨텐츠와 웹페이지의 외관을 만들 수 있게 되었다. 따라서 페이지의 문서 객체 모델(DOM)을 다루어 컨텐츠와 스타일을 변화하고, 요소를 보여주거나 숨기는 것과 같은 것들을 가능하게 했다. 동적인 HTML은 IE4와 넷스케이프 네비케이터4에서 처음 등장하였다.
- 1999년 XMLHttpRequest이 API는 클라이언트 측 스크립트를 http 또는 https로 서버에게 요청하고, 텍스트 형식으로(xml html json과 같은..) 데이터를 받는 것을 가능하게 했다.그것은 ie5에서 소개되었다.
- 2001년 JSON, 자바스크립트 기반의 데이터 교환 포맷
- 2001년 더글라스 크락포드는 lisp에서 아이디어를 얻어 텍스트 형식으로 데이터를 저장하는 자바스크립트 문법을 ‘JSON’이라 이름 붙이고 문서화했다. JSON은 객체, 배열, 문자열, 숫자들, 불린 등을 구조적인 데이터로 표현하기 위해 자바스크립트 리터럴로 사용된다.[2]
특징
- 자바스크립트를 확장하여 만들어졌다.
- 자바스크립트 객체 표기법을 따른다.
- 사람과 기계가 모두 읽기 편하도록 고안되었다.
- 프로그래밍 언어와 운영체제에 독립적이다.
표면적으로 W3C의 표준은 XML인데, 그것과는 무관하게 JSON은 2009년 말 Ecma에 의해 ECMAScript5에서 스크립트 엔진의 기본 기능으로 내장되어 버렸기 때문에 새롭게 출시되는 브라우저들 기준에서는 DOM을 통해 XML 파싱하는 것보다 JavaScript 엔진에서 JSON을 메모리로 받는 쪽이 성능으로 보나 트래픽으로 보나 훨씬 더 나은 선택이 되어버렸다. 그런 관계로 웹에서 XML은 본격 계륵화가 진행중이다.
기본적으로 JavaScript 객체 표기법의 부분집합이기 때문에 웹 브라우저 레벨에서 참 쉽게 해석할 수 있으며, 모양과 규칙 자체가 단순한 관계로 다른 언어에서 구현하기도 쉽다. 그래서 오늘날 사용되는 거의 모든 프로그래밍 언어에서 사용가능하다. 이러한 지원에 힘입어 AJAX 구현에도 상당히 빈번하게 쓰인다.
엄청나게 단순하지만 유연한 표기법이기 때문에 언어와 독립된 표준적인 데이터 표기법으로 확산되고 있다. 본래의 범위를 넘어서 바이너리 데이터 표기용으로 마개조한 BSON[4]도 있으며, NoSQL DB중 DocumentDB들에서는 그냥 표준 표기법으로 취급되고 있다. 최근에는 NoSQL뿐만 아니라 관계형DB인 PostgreSQL에서도 지원하기 시작. MySQL에서도 5.7에서 공식 지원한다.
그러나 확산되고 있다고 해도 어디까지나 웹 브라우저가 주가 되는 환경, 특히 사용자에게 보여주는 HTML 과 이를 실시간으로 가공하는 JavaScript가 연동하는 환경 위주로 퍼지고 있으며, 그렇지 않은 곳에서는 여전히 XML을 사용하는데 문제가없다. XML 파서도 다양한 플랫폼에 구현돼있고 XML이란 놈이 딱히 무슨 결함이 있는 것도 아니며 결정적으로 XML에는 스키마(Schema)가 있어서 데이터의 무결성을 검증할 수 있다. JSON은 데이터의 무결성을 검증하는 역할을 전적으로 그걸 사용하는 측에 떠맡긴다. 다만 JSON이 웹을 시작으로 편의성이 널리 알려지면서 최근 들어 다양한분야로 많이 쓰이는중이다.
그리고 JSON도 적용되는 곳이 늘어남에 따라 XML과 같이 valid한 검증이 필요해졌으며, Namespace 문제가 발생하는 경우가 늘고 있다. 이를 극복하기 위해 JSON-Schema, JSON-LD(JSON Linking Data) 같은 것이 등장하고 있다. 그러나 대응책으로 제시된 JSON 스키마는 현재 거의 쓰이지 않고 있다. 웹이라는 환경 특성상 데이터가 좀 잘못 들어간다고 해서 특별히 큰일이 나는 게 아니기 때문이다. 게다가 데이터가 잘못 들어가면 프로그램이 강제 종료한다거나 하는 크리티컬한 응용에서는 그냥 XML을 사용하고 있다. JSON은 콤마가 누락되거나 중괄호가 잘못 닫히는 등의 오염에 아주 취약하다. XML은 SAX파서를 사용해서 이런 데이터 오류를 바로잡고 재동기화가 쉽다.
Unity3D 엔진에서 플러그인으로 시리얼라이저와 디시리얼라이저를 제공하기 시작하면서 모바일 플랫폼에서도 대거 사용되기 시작한다. CSV 등 기존 포멧에 비해 태그에 의한 데이타 확장과 변형이 용이하고 과거에 비해 데이타 사용량이 자유롭기 때문에 이런 현상이 가속화 되고 있다. (단적인 예로 많은 게임 데이터들이 제이슨으로 되어있다.)[3]
활용
JSON은 자바스크립트(JavScript)의 구문 형식을 따르지만, C, C++, C#, 자바(Java), 파이선(Python) 등의 프로그램 언어와도 함께 사용되는 플랫폼과 프로그래밍 언어 면에서 독립적인 언어이다. 데이터 구조는 속성(name)과 값(value) 한 쌍으로 구성되며, “속성: 값” 형식으로 데이터 객체를 표현한다. 값(value)의 자료형으로 수(number), 문자열(string), 객체(object), 배열(array), 참/거짓(boolean), 또는 빈값(null)이 지원된다. 배열(array)은 대괄호([ ])로, 객체는 속성 · 값 쌍의 집합으로 중괄호({ })를 사용하여 표현하며, 객체 간의 구분은 쉼표(,)로 한다.[1]
종류
Object(객체)
- name/value 쌍들이 비 순서화된 Set
- {} 중괄호로 시작과 끝을 나타냄
- 각 name 뒤에 ':(colon)' 을 붙이며, ',(comma)'로 name/value 쌍들 간을 구분
- 이름은 문자열이기 때문에 반드시 따옴표를 하며, 값은 기본 자료형이거나 배열, 객체
- 각 쌍이 나오는 순서는 의미가 없으며, ','로 구분
Array
- array의 값은 순서화된 collection. 따라서 각 요소가 나타내는 순서에 의미가 있음
- [] bracket(대괄호)으로 시작과 끝을 나타냄
- ',(comma)'로 array의 값을 구분
- 배열의 각 요소는 기본자료형이나 배열, 객체
Value
- 큰 따옴표(") 안에 string, number, object, array, true, false, null이 올 수 있음
String
- 큰 따옴표 안에 둘러 쌓여 zero 이상의 Unicode(유니코드) 문자들의 조합
- 쌍 따옴표 안에 감싸지게 되며, backslash escape가 적용
- 하나의 문자(character)도 하나의 문자열(character string)로서 표현
- C 나 Java 문자열과 매우 유사
Nember
- 8진수와 16진수 형식을 사용하지 않는 것을 제외하면 C와 Java Number 처럼 매우 유사
문제점과 대안
단점
- 문법 오류에 민감하다. 콤마가 누락되거나 중괄호가 잘못 닫히는 등 구두점에서 오타가 나면 전체 JSON파일이 망가진다.
- 주석을 지원하지 않는다. 그래서 설정 파일을 JSON으로 작성하는 것은 어렵다.
- 데이터 타입을 강제할 수 없다. JSON 스키마로 보완은 가능하지만 데이터 스스로 자신의 타입을 기술할 방법이 없다.[3]
대안
위와 같은 단점을 보완하고자 YAML 등의 대체 포맷을 쓰기도 하나 기계간 데이터 전송에 주로 쓰이는 JSON의 특성상 위의 단점은 큰 문제가 아니라서 JSON은 2017년 11월 현재도 XML과 대등하게 널리 쓰이고 있다.[3]
장점
- JSON은 텍스트로 이루어져 있으므로, 사람과 기계 모두 읽고 쓰기 쉽다.
- 프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.
- 자바스크립트의 문법을 채용했기 때문에, 자바스크립트에서 eval 명령으로 곧바로 사용할 수 있다. 이런 특성은 자바스크립트를 자주 사용하는 웹 환경에서 유리하다. 그러나 실질적으로 eval 명령을 사용하면 외부에서 악성 코드가 유입될 수 있다. 모질라 파이어폭스 3.5, 인터넷 익스플로러 8, 오페라 10.5, 사파리, 구글 크롬 등 대부분의 최신 웹 브라우저는 JSON 전용 파서 기능을 내장하고 있으므로 이런 기능을 사용하는 것이 더 안전할 뿐만 아니라 빠른 방법이다.[4]
각주
참고자료
- 〈제이슨〉《네이버 지식백과》
- Lee Sungyu, 〈(번역) 자바스크립트의 역사 – 과거〉《WIT – NTS UIT BLOG》, 2014-08-13
- 〈JSON〉《나무위키》
- 〈JSON〉《위키백과》
같이 보기