데이터 포맷 — JSON · YAML · TOML · XML
데이터 포맷 — JSON · YAML · TOML · XML
프로그램들이 서로 데이터를 주고받을 때 약속된 표기 형식이 필요합니다. 설정 파일·API 응답·CI 워크플로·환경변수에서 자주 만나는 네 가지 — JSON · YAML · TOML · XML.
1. 네 포맷에 대한 이야기
| 포맷 | 출자 | 첫 표준 | 자주 쓰이는 자리 |
|---|---|---|---|
| JSON | Douglas Crockford 가 2001 년 JS 객체 문법에서 추출 | RFC 4627 (2006), 현행 RFC 8259 (2017), ECMA-404 (2013) | API 응답 · 설정 · 데이터 직렬화. |
| YAML | Clark Evans · Oren Ben-Kiki · Ingy döt Net, 2001 | YAML 1.0 (2004), 1.2 (2009) | CI 워크플로 · Kubernetes · 설정. |
| TOML | Tom Preston-Werner (GitHub 공동창업자), 2013 | TOML 1.0 (2021) | Rust Cargo · Python pyproject · 정적 사이트 설정. |
| XML | W3C, 1998 | XML 1.0 (1998) | SOAP · RSS · 일부 설정 (Maven) · 문서. |
JSON 이 가장 단순한 형식이고, YAML 은 사람 친화적이지만 함정이 많고, TOML 은 그 함정을 피하려고 만들어졌습니다. XML 은 가장 풍부한 표현이 가능하지만 무거움.
2. JSON
{
"name": "lee",
"age": 30,
"tags": ["dev", "ko"],
"active": true,
"address": null,
"profile": {
"bio": "안녕"
}
}
자료형은 6 가지 — string · number · boolean · null · array · object. 주석이 없고 후행 콤마 (,]) 도 허용 안 됨.
| 강점 | 약점 |
|---|---|
| 표준이 단순하고 보편적. | 주석 없음. |
| 거의 모든 언어가 표준 라이브러리로 지원. | 사람이 쓰기엔 따옴표·괄호 부담. |
| 기계 친화. | 큰 정수는 표현 한계 (IEEE 754 double). |
JSON5 (주석 · 후행 콤마 허용 변종, 2012) 와 JSON Lines (한 줄에 한 객체, 로그·스트림) 같은 친척이 있음.
3. YAML
name: lee
age: 30
tags:
- dev
- ko
active: true
address: null
profile:
bio: 안녕
들여쓰기가 구조. 스페이스만 사용 (탭 금지). 주석은 #. 자료형은 JSON 의 상위 집합 + 다중 문서·앵커·태그.
# 앵커와 참조 (반복 제거)
defaults: &defaults
retries: 3
timeout: 30
dev:
<<: *defaults
host: localhost
prod:
<<: *defaults
host: example.com
# 다중 줄 문자열
folded: >
여러 줄을
한 줄로 합쳐
결과는 한 줄
literal: |
여러 줄을
그대로
4. YAML 의 Norway 문제
YAML 1.1 에서 노르웨이 국가 코드 NO 가 boolean false 로 해석됩니다.
countries:
- NO # ← boolean false 가 됨
- SE
- DK
이 외에 yes · no · on · off · Y · N 도 boolean. 1.2 에서 표준은 그 해석을 빼지만 많은 라이브러리가 여전히 1.1 기본값. 안전하려면 따옴표:
countries:
- "NO"
- "SE"
또 다른 함정 — 8 진수 해석. 일부 파서가 010 을 8 진수 8 로 해석.
5. TOML
name = "lee"
age = 30
active = true
address = ""
tags = ["dev", "ko"]
[profile]
bio = "안녕"
[servers.dev]
host = "localhost"
port = 8080
[servers.prod]
host = "example.com"
port = 443
[[items]]
id = 1
[[items]]
id = 2
명확한 키=값. 주석은 #. 자료형은 JSON 보다 풍부해 날짜·시각이 1 급.
| 강점 | 약점 |
|---|---|
| 모호함이 적음. | 깊은 중첩이 길어짐. |
| 주석 가능. | 표현력은 YAML 에 미치지 못함. |
| 사람이 쓰기 편함. | 복잡한 구조에서 가독성 저하. |
Cargo (Cargo.toml), Python pyproject.toml, Hugo · Zola 같은 정적 사이트 생성기가 표준 채택.
6. XML
<?xml version="1.0" encoding="UTF-8"?>
<user id="42">
<name>lee</name>
<age>30</age>
<tags>
<tag>dev</tag>
<tag>ko</tag>
</tags>
</user>
태그·속성·네임스페이스·DTD/XSD 스키마 등 표현력이 풍부. 한때 SOAP · RSS · Atom · Office Open XML (.docx) 등에 광범위하게 쓰였고, 근래는 JSON 에 자리를 많이 내줌.
7. 한눈에
| 항목 | JSON | YAML | TOML | XML |
|---|---|---|---|---|
| 주석 | 없음 | 가능 | 가능 | 가능 |
| 들여쓰기 의존 | 없음 | 있음 | 없음 | 없음 |
| 사람 친화 | 보통 | 높음 | 높음 | 낮음 |
| 모호성 | 적음 | 많음 | 적음 | 적음 |
| 스키마 | JSON Schema | JSON Schema 차용 | 부족 | XSD · DTD 풍부 |
8. 다른 길들
특수한 자리에서 자주 만나는 형식:
- Protocol Buffers (protobuf) — Google 2008. 바이너리. 스키마 먼저.
- MessagePack — 바이너리 JSON. JSON 호환 + 작은 크기.
- CBOR — RFC 8949. IoT 친화 바이너리.
- HOCON — Typesafe 의 Config. JSON 의 사람 친화 변종.
- EDN — Clojure 데이터 포맷.
- CSV · TSV — 표 형식 데이터의 가장 단순한 자리. 콤마·따옴표 이스케이프 함정 많음.
9. 언어별 표준 도구
// JS — JSON 만 표준 내장
const obj = JSON.parse('{"a":1}');
const s = JSON.stringify(obj, null, 2);
// YAML/TOML 은 라이브러리 (js-yaml · smol-toml)
import yaml from "js-yaml";
const data = yaml.load(text);
# Python
import json
data = json.loads(s); s = json.dumps(data, indent=2, ensure_ascii=False)
import yaml # PyYAML
data = yaml.safe_load(text)
import tomllib # 3.11+ 표준
data = tomllib.loads(text)
명령줄 변환:
cat data.json | jq . # mac · Linux. Windows 는 choco install jq
yq -o=json . config.yaml # YAML → JSON
yq -P . data.json # JSON → YAML
10. 자주 걸리는 자리
JSON — 후행 콤마 금지, 키는 반드시 큰따옴표, 주석 없음.
YAML — 들여쓰기를 탭으로 (스페이스만 허용). 노르웨이 문제 같은 boolean 함정. 빈 값과 null 의 표기 (~ · null · 빈 문자열) 가 다름.
TOML — 같은 키를 여러 자리에서 정의하면 에러. 배열 of 테이블 ([[items]]) 과 일반 테이블 차이가 처음에 어려움.
XML — 네임스페이스가 끼면 파싱 코드가 길어짐. XXE (외부 엔티티) 보안 취약점이 있어 파서 옵션 점검.
인코딩 — 거의 모두 UTF-8. BOM 이 들어가면 일부 파서가 첫 키를 못 찾음.
주석을 못 다는 자리 — JSON 설정에서 메모를 남기려고 키 이름에 _comment 를 끼우는 임시 우회. JSON5 또는 JSONC (VS Code) 가 대안.
버전 — YAML 1.1 vs 1.2 의 차이. 라이브러리 문서로 어느 쪽인지 확인.
하고픈 말
데이터 포맷은 자리별로 정해진 모양이 있어 임의로 바꾸기 어렵습니다. JSON 은 API · 설정의 표준, YAML 은 CI · k8s · docker compose, TOML 은 언어 패키지 매니저 (Rust · Python), XML 은 레거시 자리 — 이 매트릭스를 이해하면 처음 마주치는 파일도 빨리 읽힙니다.
Next
- wsl2
RFC 8259 JSON · ECMA-404 · YAML 1.2 · TOML 1.0 · XML 1.0 · Norway Problem · JSON5 · jq · yq · JSON Schema 를 참고합니다.