codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›environment

데이터 포맷 — JSON · YAML · TOML · XML

2026-04-28 게시· 2026-05-18 갱신·0회 조회

데이터 포맷 — 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 를 참고합니다.

environment 카테고리의 다른 글

카테고리 전체 보기 →
  • WSL2 — Windows 위의 Linux
  • 터미널 첫날
  • 텍스트 인코딩과 줄바꿈
  • Markdown
  • 크로스 플랫폼 스크립트
  • cmd.exe 와 배치 파일