json format data web development

JSON 마스터하기: 포맷팅 및 유효성 검사 필수 가이드

전문적인 JSON 포맷터로 개발 워크플로우를 간소화하세요. JSON 데이터를 쉽게 유효성 검사하고, 보기 좋게 만들고, 압축할 수 있습니다.

JSON이란 무엇인가?

JSON(JavaScript Object Notation)은 사람이 읽고 쓰기 쉽고, 기계가 분석하고 생성하기도 쉬운 경량의 텍스트 기반 데이터 교환 형식입니다. JavaScript 문법에서 파생되었지만, JSON은 언어에 독립적입니다. 현대의 거의 모든 프로그래밍 언어에는 JSON을 파싱하고 생성하는 라이브러리가 있습니다.

JSON은 2000년대 초 Douglas Crockford가 웹에서의 데이터 교환을 위해 XML보다 단순한 대안으로 소개했습니다. 오늘날 JSON은 REST API, 설정 파일, MongoDB 같은 데이터베이스 등에서 주류 형식으로 자리 잡았습니다.


JSON 문법: 완전한 그림

JSON 값은 다음 중 하나입니다:

  • 객체(Object): { "key": value, ... } — 키-값 쌍의 순서 없는 컬렉션
  • 배열(Array): [ value, ... ] — 값의 순서 있는 목록
  • 문자열(String): "hello world" — 반드시 큰따옴표 사용
  • 숫자(Number): 42, 3.14, -7, 1.5e10 — 정수와 부동소수점 구분 없음
  • 불리언(Boolean): true 또는 false
  • Null: null
{
  "name": "김지영",
  "age": 30,
  "isActive": true,
  "scores": [95, 87, 100],
  "address": {
    "city": "서울",
    "postcode": "04524"
  },
  "notes": null
}

자주 하는 문법 실수

실수 유형 잘못된 예 올바른 예
후행 쉼표 { "a": 1, } { "a": 1 }
작은따옴표 { 'key': 'val' } { "key": "val" }
따옴표 없는 키 { key: "val" } { "key": "val" }
주석 { // 주석 } (지원되지 않음)
Undefined { "a": undefined } null 사용 또는 키 생략

JSON의 간략한 역사

  • 2001년: Douglas Crockford가 상태 없는 서버-브라우저 통신 프로토콜로 JSON 보급 시작
  • 2006년: IETF가 최초의 공식 JSON 명세인 RFC 4627 발행
  • 2013년: ECMA International이 JSON을 ECMA-404로 공식 표준화
  • 2017년: RFC 8259가 이전 모든 RFC를 대체하여 최종 표준이 됨

JSON 이전에는 XML이 API 통신을 지배했습니다. JSON의 간결함과 JavaScript 객체와의 자연스러운 호환성이 Web 2.0 시대에 폭발적인 성장을 이끌었으며, 이 추세는 계속 가속화되고 있습니다.


JSON의 활용 분야

REST API

오늘날 거의 모든 REST API는 JSON을 반환합니다. 날씨 API에 대한 요청 응답은 다음과 같습니다:

{
  "location": "서울",
  "temperature": 22.4,
  "unit": "celsius",
  "conditions": ["흐림", "습함"],
  "forecast": [
    { "day": "월요일", "high": 24, "low": 18 },
    { "day": "화요일", "high": 21, "low": 16 }
  ]
}

설정 파일

ESLint(.eslintrc.json), TypeScript(tsconfig.json), npm(package.json) 등의 도구는 모두 JSON을 설정에 사용합니다.

NoSQL 데이터베이스

MongoDB는 BSON(Binary JSON) 형식으로 문서를 저장합니다. CouchDB, Firebase Firestore, DynamoDB는 모두 JSON 유사 문서 모델을 사용합니다.

로컬 스토리지와 쿠키

브라우저의 localStorage는 문자열만 저장할 수 있으므로, 개발자들은 저장 전에 JSON.stringify()로 객체를 직렬화하고, 불러올 때 JSON.parse()로 역직렬화합니다.

로깅 및 관찰 가능성

JSON 형식의 구조화된 로그는 Elasticsearch, Datadog, Loki 같은 도구로 로그를 쿼리하기 쉽게 만들어 줍니다.


실전 JSON 파싱

JavaScript / TypeScript

// 문자열을 객체로 변환
const data = JSON.parse('{"name":"김지영","age":30}');
console.log(data.name); // "김지영"

// 객체를 문자열로 직렬화
const json = JSON.stringify({ name: "김지영", age: 30 }, null, 2);

JSON.stringify의 선택적 인수 null, 2는 2칸 들여쓰기의 pretty-print를 적용합니다. 디버깅 시 매우 유용합니다.

Python

import json

# 파싱
data = json.loads('{"name": "김지영", "age": 30}')
print(data["name"])  # 김지영

# 직렬화
text = json.dumps({"name": "김지영", "age": 30}, indent=2, ensure_ascii=False)

Go

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    var p Person
    json.Unmarshal([]byte(`{"name":"김지영","age":30}`), &p)
    fmt.Println(p.Name)
}

고급 주제

JSON Schema

JSON Schema는 JSON 데이터의 구조를 검증하기 위한 어휘입니다. 필수 필드, 값의 타입, 패턴, 제약 조건을 정의할 수 있습니다:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 0 }
  },
  "required": ["name", "age"]
}

JSON Pointer (RFC 6901)

JSON Pointer는 JSON 문서 내의 특정 값을 식별하기 위한 문자열 문법을 제공합니다:

  • /namename 필드
  • /scores/0scores 배열의 첫 번째 요소

JSON Patch (RFC 6902)

JSON Patch는 JSON 문서에 적용할 일련의 연산을 표현하는 형식을 정의합니다. API에서 증분 업데이트에 유용합니다.


성능 고려 사항

  • 크기: JSON은 텍스트 기반이며 장황합니다. 고처리량 시스템에서는 MessagePack이나 Protocol Buffers 같은 바이너리 대안을 고려하세요.
  • 파싱 속도: 현대의 JSON 파서(simdjson 등)는 초당 기가바이트를 파싱할 수 있지만, 대부분의 웹 앱에서 JSON 파싱은 병목이 되지 않습니다.
  • 깊은 중첩 구조: 매우 깊은 중첩은 재귀 파서에서 스택 오버플로 오류를 유발할 수 있습니다. 가능하면 구조를 적절히 평탄하게 유지하세요.

JSON vs XML vs YAML

특징 JSON XML YAML
가독성 좋음 장황함 우수
주석
바이너리 지원 ❌ (base64 필요)
스키마 검증 JSON Schema XSD ❌ (제한적)
최적 용도 API, 설정, 저장 문서, 레거시 설정 파일

모범 사례

  1. 입력 시 검증하기: 들어오는 JSON을 절대 신뢰하지 마세요. 항상 스키마에 대해 검증하거나 예상 필드를 확인하세요.
  2. null을 의도적으로 사용하기: "필드가 없음"과 "필드가 명시적으로 null임"을 구분하세요.
  3. 깊은 중첩 구조 피하기: 평탄한 데이터가 다루기 쉽습니다. 관련 객체 연결에는 ID를 사용하세요.
  4. 일관된 키 명명: 관례(camelCase, snake_case)를 정하고 API 전체에서 통일하세요.
  5. 날짜는 ISO 8601 문자열로: JSON에는 날짜 타입이 없습니다. 상호 운용성을 위해 "2025-04-09T00:00:00Z" 형식을 사용하세요.
  6. 프로덕션에서는 압축, 디버깅 시 pretty-print: API 응답에서는 대역폭 절감을 위해 간결한 JSON을 사용하고, 로컬에서는 pretty-print하세요.

요약

JSON은 그만한 이유가 있어 웹에서 데이터 교환의 공용어가 되었습니다. 단순하고, 읽기 쉽고, 어디서나 지원됩니다. JSON의 문법, 한계, 모범 사례를 이해하면 API 구축, 설정 파일 작성, 데이터 파이프라인 처리 등 모든 상황에서 더 효과적인 개발자가 될 수 있습니다.