topic★★★★★난이도 · 약 15분
설정 파일 3형제 — JSON · YAML · TOML
API는 JSON · K8s/CI는 YAML · Rust/Python 설정은 TOML — 차이와 함정.
#JSON#YAML#TOML#설정
왜 배우는가
`.github/workflows/*.yml`·`package.json`·`pyproject.toml` — 프로젝트마다 3가지가 섞여 있다. 차이와 미묘한 함정(YAML 들여쓰기·JSON 주석 금지·TOML 엄격)을 알면 설정 버그가 줄어든다.
| 포맷 | 기계 친화 | 사람 친화 | 주석 | 확장자 | 주 용도 |
|---|---|---|---|---|---|
| JSON | ★★★ | ★ | ❌ | .json | API·설정·데이터 |
| YAML | ★★ | ★★★ | ✅ `#` | .yml/.yaml | K8s·Ansible·GitHub Actions |
| TOML | ★★ | ★★ | ✅ `#` | .toml | Rust Cargo·Python pyproject |
text
# 같은 데이터 3가지 포맷
━━━ JSON ━━━
{
"name": "jit",
"version": "1.0",
"deps": ["react", "next"],
"server": { "port": 3000, "host": "localhost" }
}
━━━ YAML ━━━
name: jit
version: "1.0" # 인용 없으면 1 (숫자)로 해석됨!
deps:
- react
- next
server:
port: 3000
host: localhost
━━━ TOML ━━━
name = "jit"
version = "1.0"
deps = ["react", "next"]
[server]
port = 3000
host = "localhost"YAML의 `1.0`은 숫자 1로 해석돼 "version이 왜 1이지?" 사고. 버전은 항상 `"1.0"` 문자열로.
JSON은 엄격. 주석 금지, 마지막 콤마 금지, 키는 쌍따옴표. 주석이 필요하면 JSON5 또는 JSONC(VSCode 확장) — 단 npm·API 표준은 순수 JSON.
text
# JSON 함정 체크리스트
❌ { "a": 1, } // trailing comma 금지
❌ { 'a': 1 } // 홑따옴표 금지
❌ // 주석 // 주석 금지
✅ { "a": 1 }
# YAML 함정 (실전 사고 많음)
❌ tab 들여쓰기 → 에러 // 반드시 스페이스
❌ version: 1.0 // 1.0 → 1 (float 해석)
✅ version: "1.0"
❌ no: 1 // "no" 키 → false로 해석될 위험
✅ "no": 1
# TOML 함정
❌ duplicate keys 금지
❌ 문자열은 " " (홑따옴표도 되지만 escape 다름)
✅ 엄격한 문법이 장점 (모호한 파싱 거의 없음)YAML 사고 1순위는 탭 들여쓰기와 Norway 문제(`no`가 `false`로 파싱). K8s 매니페스트 쓸 때 특히 주의.
javascript
// 파싱·직렬화 비교
// JSON (내장)
JSON.parse('{"a":1}'); // { a: 1 }
JSON.stringify(obj, null, 2); // 2칸 들여쓰기
// YAML — js-yaml 라이브러리
import yaml from "js-yaml";
const data = yaml.load(yamlString);
yaml.dump(obj);
// TOML — @iarna/toml 또는 smol-toml
import TOML from "smol-toml";
TOML.parse(tomlString);YAML은 표준 라이브러리 없음 → js-yaml이 사실상 표준. TOML은 smol-toml이 경량.
실기 드릴 2문항
check_circle실기 드릴 · OX
JSON에 주석(`//`, `/* */`)을 쓸 수 있다.
edit실기 드릴 · 단답형
YAML에서 `version: 1.0` 이라고 쓰면 파서가 해석하는 값은?