JSON 포맷팅 & 검증: 완벽한 개발자 가이드

· 12분 읽기

목차

JSON(JavaScript Object Notation)은 웹에서 데이터 교환을 위한 사실상의 표준이 되었습니다. REST API를 구축하든, 애플리케이션을 구성하든, 구조화된 데이터를 저장하든, JSON 포맷팅과 검증을 이해하는 것은 현대 개발에 필수적입니다.

이 종합 가이드는 기본 구문 규칙부터 고급 검증 기법, 보안 고려사항, 그리고 다양한 프로그래밍 언어와 환경에서의 실용적인 도구 사용까지 모든 것을 다룹니다.

JSON 구문 규칙

JSON은 사람이 읽을 수 있고 기계가 파싱할 수 있는 경량 텍스트 기반 데이터 교환 형식입니다. 이름에서 JavaScript와의 연관성을 암시하지만, JSON은 완전히 언어 독립적이며 거의 모든 현대 프로그래밍 언어에서 지원됩니다.

이 형식은 원래 Douglas Crockford에 의해 명세되었으며 현재 RFC 8259로 정의되어 있습니다. 단순성과 보편성으로 인해 API, 구성 파일, NoSQL 데이터베이스 및 전 세계 데이터 저장 시스템에서 선호되는 선택이 되었습니다.

핵심 데이터 타입

JSON은 정확히 6가지 데이터 타입을 지원하며, 각각 특정 포맷팅 요구사항이 있습니다:

타입 예시 참고사항
문자열 "hello world" 큰따옴표를 사용해야 하며, 유니코드 이스케이프 시퀀스 지원
숫자 42, 3.14, -1, 2.5e10 선행 0 없음, 16진수 없음, 과학적 표기법 지원
불리언 true, false 소문자만 가능, 따옴표 없음
Null null 소문자만 가능, 값의 부재를 나타냄
객체 {"key": "value"} 순서 없는 컬렉션, 키는 문자열이어야 함
배열 [1, 2, 3] 순서가 있는 목록, 혼합 타입 포함 가능

프로 팁: JSON 포매터를 사용하여 구문 강조 및 오류 감지로 JSON을 즉시 검증하고 프리티 프린트하세요.

문자열 이스케이프 규칙

JSON 문자열은 특수 문자에 대한 적절한 이스케이프가 필요합니다. 필수 이스케이프 시퀀스는 다음과 같습니다:

이스케이프 문자가 포함된 예시:

{
  "message": "Line 1\nLine 2",
  "path": "C:\\Users\\Documents",
  "quote": "He said \"Hello\"",
  "emoji": "\u2764\uFE0F"
}

숫자 형식 명세

JSON 숫자는 일부 프로그래밍 언어와 다른 엄격한 포맷팅 규칙을 따릅니다:

일반적인 JSON 오류 및 해결 방법

경험 많은 개발자도 JSON 구문 실수를 합니다. 가장 일반적인 오류를 이해하면 더 빠르게 디버깅하고 처음부터 유효한 JSON을 작성할 수 있습니다.

오류 잘못된 예시 올바른 예시 설명
후행 쉼표 {"a": 1,} {"a": 1} JSON은 객체나 배열에서 후행 쉼표를 허용하지 않음
작은따옴표 {'a': 'b'} {"a": "b"} 문자열과 키에는 큰따옴표만 유효함
따옴표 없는 키 {name: "John"} {"name": "John"} 객체 키는 항상 따옴표로 묶인 문자열이어야 함
주석 {"a": 1} // comment 허용되지 않음 JSON 명세는 주석을 지원하지 않음
단독 값 hello "hello" 최상위 값은 객체, 배열 또는 따옴표로 묶인 문자열이어야 함
Undefined {"a": undefined} {"a": null} undefined 대신 null 사용
따옴표 누락 {"date": 2024-01-01} {"date": "2024-01-01"} 숫자가 아닌 값은 따옴표가 필요함

빠른 팁: JSON 검증기를 사용하여 문제가 발생한 정확한 위치를 보여주는 상세한 오류 메시지로 이러한 오류를 즉시 포착하세요.

파싱 오류 디버깅

JSON 파싱이 실패하면 오류 메시지가 종종 문자 위치를 가리킵니다. 일반적인 오류 메시지를 해석하는 방법은 다음과 같습니다:

대부분의 최신 검증기는 오류가 발생한 정확한 줄과 열을 보여주므로 수동 검사보다 훨씬 빠르게 디버깅할 수 있습니다.

포맷팅 및 프리티 프린팅

압축된 JSON은 데이터 전송에 효율적이지만 사람이 읽기는 거의 불가능합니다. 프리티 프린팅은 구조를 명확하고 탐색 가능하게 만들기 위해 공백을 추가합니다.

압축 vs 프리티 프린트

동일한 데이터를 두 형식으로 표현한 예시:

// 압축 (1줄, 68바이트)
{"name":"John","age":30,"city":"New York","skills":["JavaScript","Python"]}
// 2칸 들여쓰기로 프리티 프린트 (6줄, 108바이트)
{
  "name": "John",
  "age": 30,
  "city": "New York",
  "skills": ["JavaScript", "Python"]
}

압축 버전은 40바이트(37% 감소)를 절약하지만 모든 가독성을 희생합니다. 프로덕션 API의 경우 압축된 JSON이 대역폭을 줄이고 성능을 향상시킵니다. 개발, 구성 파일 및 디버깅의 경우 프리티 프린트된 JSON이 필수적입니다.

들여쓰기 스타일

커뮤니티마다 들여쓰기에 대한 선호도가 다릅니다:

핵심은 프로젝트 내에서 일관성을 유지하는 것입니다. 대부분의 팀은 린팅 도구와 에디터 구성을 통해 이를 강제합니다.

프로 팁: 저장 시 JSON을 포맷하도록 에디터를 구성하세요. VS Code 사용자는 설정에 "editor.formatOnSave": true를 추가하고 JSON 포매터 확장을 설치할 수 있습니다.

객체 키 정렬

JSON 객체는 기술적으로 순서가 없지만, 키를 알파벳순으로 정렬하면 가독성이 향상되고 버전 관리에서 diff가 더 깔끔해집니다:

// 정렬되지 않음
{
  "version": "1.0",
  "name": "myapp",
  "author": "John Doe",
  "dependencies": {}
}

// 알파벳순으로 정렬됨
{
  "author": "John Doe",
  "dependencies": {},
  "name": "myapp",
  "version": "1.0"
}

많은 JSON 포매터가 옵션으로 자동 키 정렬을 제공합니다. 이는 여러 개발자가 자주 편집하는 구성 파일에 특히 유용합니다.

JSONPath 쿼리

JSONPath는 JSON 문서에서 데이터를 추출하기 위한 쿼리 언어를 제공하며, XPath가 XML에서 작동하는 방식과 유사합니다. 복잡한 중첩 구조로 작업하거나 프로그래밍 방식으로 특정 값을 추출해야 할 때 매우 유용합니다.

기본 JSONPath 구문

JSONPath 표현식은 루트 요소를 나타내는 $로 시작하고 자식 연산자와 필터가 뒤따릅니다:

표현식 의미 예시 결과
$ 루트 요소 전체 문서
$.store.book 상점의 모든 책 책 객체 배열
$.store.book[0] 첫 번째 책 단일 책 객체
$.store.book[-1] 마지막 책 단일 책 객체
$.store.book[0,2] 첫 번째와 세 번째 책 2권의 책이 있는 배열
$.store.book[0:2] 처음 두 권의 책 (슬라이스) 2권의 책이 있는 배열
$.store.book[*].title 모든 책 제목 문자열 배열
$..price 모든 가격 (재귀적) 숫자 배열
$.store.book[?(@.price<10)] $10 미만의 책 필터링된 배열
$.store.book[?(@.category=='fiction')] 소설 책 필터링된 배열

빠른 팁: JSONPath 파인더 도구로 JSONPath 쿼리를 대화식으로 테스트하여 실시간으로 결과를 확인하세요.

고급 필터링

JSONPath는 비교 연산자와 논리 조건을 사용한 복잡한 필터 표현식을 지원합니다:

여러 조건이 있는 예시:

// 소설이면서 $15 미만인 책 찾기
$.store.book[?(@.category=='fiction' && @.price<15)]

// 특정 저자의 책 찾기
$.store.book[?(@.author=='Tolkien' || @.author=='Rowling')]

// ISBN이 있는 책 찾기
$.store.book[?(@.isbn)]

실용적인 사용 사례

JSONPath는 여러 실제 시나리오에서 뛰어납니다:

JSON 스키마 검증

JSON 스키마는 JSON 문서에 주석을 달고 검증할 수 있는 어휘입니다. JSON 데이터에 대한 계약을 제공하여 특정 구조 및 타입 요구사항을 충족하는지 확인합니다.

JSON 스키마를 사용하는 이유는?

스키마 검증은 여러 중요한 이점을 제공합니다:

기본 스키마 예시

사용자 객체를 정의하는 간단한 스키마:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["admin", "user", "guest"]
      },
      "minItems": 1,
      "uniqueItems": true
    }
  },
  "required": ["name", "email"],
  "additionalProperties": false
}

이 스키마는 유효한 사용자 객체가 이름과 이메일을 가져야 하며, 특정 제약 조건을 충족하는 선택적 나이 및 역할 필드를 가질 수 있도록 강제합니다.

일반적인 스키마