JSON 데이터 구조 완벽 가이드
웹 개발과 API 통신의 표준 데이터 포맷인 JSON의 핵심 원리부터 실무 활용 노하우, 그리고 현업 개발자들이 매일 겪는 대표적인 파싱 오류 해결 방법까지 상세하게 알아봅니다.
JSON이란 무엇이며 어떤 특징을 가지는가?
JSON(JavaScript Object Notation)은 데이터를 저장하거나 전송할 때 널리 사용하는 경량의 텍스트 기반 데이터 교환 형식입니다. 2000년대 초반 더글러스 크록포드(Douglas Crockford)에 의해 정립되었으며, 현재는 국제 표준 규격(RFC 8259 및 ECMA-404)으로 지정되어 전 세계 거의 모든 프로그래밍 언어에서 널리 활용되고 있습니다.
JSON은 자바스크립트의 객체 표기법에서 착안하여 탄생했으나, 특정 언어에 종속되지 않는 완전한 독립적(Language-Independent) 포맷입니다. 기계가 신속하게 파싱하고 생성할 수 있으면서도, 개발자가 직관적으로 읽고 이해할 수 있도록 설계된 것이 가장 큰 특징입니다.
JSON 데이터가 지원하는 6가지 기본 자료형:
- •문자열(String): 반드시 큰따옴표(
"...")로 감싸진 유니코드 문자열 - •숫자(Number): 정수, 부동소수점 소수(소수점, 지수 표기법 지원)
- •불리언(Boolean): 참 또는 거짓을 나타내는
true,false소문자 값 - •널(Null): 빈 값을 의미하는
null리터럴 - •객체(Object): 중괄호(
{ }) 안에 키-값 쌍의 순서 없는 집합 - •배열(Array): 대괄호(
[ ]) 안에 순서를 가지는 0개 이상의 값 목록
*주의: JSON 규격에는 함수(Function), 날짜 객체(Date 객체 자체), 정규식(RegExp), 주석(Comments), undefined 타입이 포함되지 않으며, 오직 순수한 직렬화 데이터만 표현할 수 있습니다.
프론트엔드와 API 통신에서 JSON이 표준으로 사용되는 이유
과거 웹 초기에는 XML(Extensible Markup Language)이나 SOAP 통신이 엔터프라이즈 환경의 지배적인 표준이었습니다. 그러나 웹 2.0과 비동기 AJAX 통신, 모바일 생태계가 급격히 발전하면서 사실상 모든 프론트엔드-백엔드 간 통신의 사실상 표준(De Facto Standard) 자리는 JSON이 차지하게 되었습니다. 그 이유는 명확합니다.
1. JavaScript 네이티브 엔진의 즉각적인 지원
웹 브라우저의 자바스크립트 가상 머신(V8 등)은 JSON 문자열을 네이티브 C++ 레벨에서 최적화된 JSON.parse() 및 JSON.stringify() 메서드로 처리합니다. 별도의 무거운 외부 파서 라이브러리 없이도 즉각 자바스크립트 객체로 변환되므로 렌더링 성능이 압도적입니다.
2. 압도적으로 가벼운 페이로드와 네트워크 대역폭 절약
XML은 열림 태그와 닫힘 태그(<user></user>)가 반복되어 실제 데이터보다 메타데이터가 더 많은 용량을 차지하는 오버헤드가 발생합니다. 반면 JSON은 간결한 키-값 구조만 유지하므로 전송 데이터 크기가 30%~50% 이상 절감되어 모바일 네트워크 환경에 최적화됩니다.
3. RESTful API 및 현대 웹 아키텍처와의 완벽한 궁합
오늘날 대부분의 HTTP API는 Content-Type: application/json 헤더를 기반으로 통신합니다. Fetch API, Axios, Vue, React 등 모던 프레임워크가 JSON 기반 응답을 기본값으로 전제하고 설계되어 있어 개발 생산성을 극대화합니다.
4. 다언어 백엔드 및 NoSQL DB와의 자연스러운 매핑
Java(Jackson/Gson), Python(json/pydantic), Go, Rust 등 모든 최신 백엔드 언어가 견고한 JSON 직렬화/역직렬화를 지원합니다. 또한 MongoDB의 BSON, PostgreSQL의 JSONB와 같이 데이터베이스 저장 포맷과도 1:1로 매핑되어 데이터 변환 손실이 없습니다.
개발자들이 자주 겪는 JSON 파싱 에러 3가지와 해결 방법
프론트엔드 개발이나 API 연동 중 흔하게 맞닥뜨리는 SyntaxError: Unexpected token ... in JSON at position ... 에러는 대개 사소한 문법 차이에서 비롯됩니다. 가장 빈번히 발생하는 3대 에러의 원인과 해결책을 정리했습니다.
마지막 요소 뒤의 쉼표 (Trailing Comma) 에러
최신 자바스크립트 문법(ES6+)에서는 객체나 배열의 마지막 요소 뒤에 쉼표(Trailing Comma)를 두는 것이 Git diff를 깔끔하게 유지하기 위한 권장 패턴입니다. 하지만 JSON 표준 사양(RFC 8259)에서는 마지막 쉼표를 엄격하게 금지합니다.
{
"name": "KlevrCode",
"active": true, // ⚠️ 마지막 쉼표 금지!
}{
"name": "KlevrCode",
"active": true
}해결 방법: 객체나 배열을 닫는 중괄호(}) 또는 대괄호(]) 직전에 찍힌 마지막 쉼표를 반드시 삭제하세요. 본 포맷터 도구에 붙여넣으면 유효성 검사기가 즉시 위치를 확인해 줍니다.
작은따옴표(Single Quote) 사용 및 키의 따옴표 누락
자바스크립트 객체 표기법에서는 키 이름을 따옴표 없이 쓰거나(name: 'Dev'), 문자열을 작은따옴표('...')로 둘러싸도 유효합니다. 그러나 JSON에서는 모든 프로퍼티 키와 문자열 값을 반드시 큰따옴표(Double Quote, "...")로만 감싸야 합니다.
{
id: 101, // ⚠️ 키에 큰따옴표 누락
'role': 'admin' // ⚠️ 작은따옴표 사용 불가
}{
"id": 101,
"role": "admin"
}해결 방법: 모든 키와 문자열을 쌍따옴표(")로 교체하세요. 백틱(`)을 사용한 템플릿 리터럴 역시 JSON에서는 인식되지 않으므로 주의해야 합니다.
이스케이프되지 않은 제어 문자 및 멀티라인 줄바꿈 에러
사용자 입력 텍스트나 게시글 본문 데이터를 JSON 문자열 값 안에 직접 집어넣을 때 흔히 발생합니다. JSON 문자열 내부에는 실제 줄바꿈(Enter/Carriage Return), 탭(Tab), 백슬래시(\), 큰따옴표(")가 원시 문자 그대로 들어가면 파서가 문장의 끝으로 오인하여 Bad control character 오류를 일으킵니다.
{
"desc": "첫번째 줄
두번째 줄",
"quote": "그는 "안녕"이라 말했다"
}{
"desc": "첫번째 줄\n두번째 줄",
"quote": "그는 \"안녕\"이라 말했다"
}해결 방법: 줄바꿈은 \n, 탭 문자는 \t, 문자열 내부의 큰따옴표는 \", 백슬래시는 \\로 이스케이프 처리하세요. 프론트엔드에서는 직접 조작하기보다 직렬화 유틸리티나 본 포맷터 도구를 사용하는 것이 안전합니다.
KlevrCode 실무 개발 꿀팁
운영 환경에서는 네트워크 전송량을 줄이기 위해 공백을 제거한 압축(Minify) 모드를 사용하고, 개발 단계나 디버깅 및 API 문서 작성 시에는 상단의 포맷팅 하기 (2칸 들여쓰기) 기능을 활용하면 팀 생산성을 획기적으로 개선할 수 있습니다.