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★★★.jsonAPI·설정·데이터
YAML★★★★★✅ `#`.yml/.yamlK8s·Ansible·GitHub Actions
TOML★★★★✅ `#`.tomlRust 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` 이라고 쓰면 파서가 해석하는 값은?