본문 바로가기
C.W.K.
Stream
Lesson 01 of 08 · published

TOML 이 뭐야, 그리고 왜 Rust + Python 이 골랐나

~10 min · toml, config, history

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

YAML 과 JSON 이 계속 실패한 포맷

TOML 은 Tom's Obvious, Minimal Language 의 줄임말이야. GitHub 공동 창립자인 Tom Preston-Werner 가 2013 년에 만들었어. 목표는 셋이었어. 처음 봐도 뜻이 바로 보이고, 문법은 최소고, 파싱에 헷갈릴 구석이 없는 config 파일 포맷. 지금 spec 은 TOML 1.0.0 (2021) 이고.

YAML 과 JSON 이 못 한 거 TOML 이 잘하는 거

  • 들여쓰기 규칙이 없어 — key 도 table 도 공백에 안 기대. 섹션을 파일 이곳저곳으로 복붙해도 안 깨져.
  • 값 하나를 적는 방법이 하나야 — 문자열은 따옴표로, 숫자는 그냥, boolean 은 true/false. Norway 문제 같은 게 생길 자리가 없어.
  • 날짜와 시간이 진짜 타입이야 — RFC 3339 datetime 이 문자열이 아니라 값 그 자체로 들어가.
  • 주석 — YAML 에서 # 가 먹히는 자리면 여기서도 다 먹혀.
  • 장황하지만 분명한 table 문법 — 네 단계 넘게 깊어지면 [server.database] 쪽이 중첩된 YAML 보다 나아.

TOML 이 조용히 점령한 곳

  • Rust — 생태계의 모든 Cargo.toml 이 TOML 이야.
  • Pythonpyproject.toml (PEP 518/621) 이 요즘 패키징에서 setup.pysetup.cfg, requirements.txt 를 다 대신해.
  • Hugoconfig.toml 또는 hugo.toml 한 장이 정적 사이트 생성기를 굴려.
  • Poetry, ruff, black, hatch — Python 도구들이 하나같이 pyproject.toml[tool.*] table 에서 설정을 읽어.
  • Vector, Tilt, GoReleaser — 사람이 읽기 좋으라고 TOML 을 고른 운영 도구들이야.
원칙: config 를 기계보다 사람이 더 자주 읽는다면 TOML 이 이겨. 깊은 중첩을 도저히 못 피하는 자리에서는 YAML 이 이기고. 네트워크로 오갈 땐 JSON 이 이겨. 전통이 아니라 읽을 사람을 보고 골라.

Code

Hello, TOML·toml
# 최상위 key
name = "Pippa"
age = 5
is_assistant = true

# Table — [section] 헤더가 sub-object 도입
[home]
city = "Seoul"
timezone = "Asia/Seoul"

# 배열
loves = ["markdown", "json", "yaml", "toml"]
세 언어로 TOML parse·bash
# Python 3.11+ (stdlib!)
python -c "import tomllib; print(tomllib.load(open('config.toml','rb')))"

# Python <3.11 (third-party)
pip install tomli
python -c "import tomli; print(tomli.load(open('config.toml','rb')))"

# Rust
cargo add toml
# let config: Config = toml::from_str(&text)?;

# Go
# import "github.com/BurntSushi/toml"
# toml.Unmarshal(data, &config)
같은 데이터, 세 포맷·text
# JSON                          # YAML                    # TOML
{                                                          name = "Pippa"
  "name": "Pippa",              name: Pippa                age = 5
  "age": 5,                     age: 5                     [home]
  "home": {                     home:                      city = "Seoul"
    "city": "Seoul",              city: Seoul              timezone = "Asia/Seoul"
    "timezone": "Asia/Seoul"      timezone: Asia/Seoul
  }
}

External links

Exercise

Python 프로젝트의 pyproject.toml 하나 열어. 머릿속에서 TOML 로 읽어 — key, table, 배열. 이제 정신적으로 YAML 로 번역. 어디서 TOML 의 flat-section 스타일이 더 readable 한지 (최상위 메타데이터, 단순 도구 config) 어디서 장황해지는지 (깊이 중첩된 설정) 봐. 그 직관이 YAML 위 TOML 고를 때.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.