TOML 완벽 가이드 — 왜 탄생했고, JSON·YAML·INI와 무엇이 다른가
중년개발자
@loxo
16일 전
TOML 완벽 가이드 — 왜 탄생했고, JSON·YAML·INI와 무엇이 다른가
TOML(톰엘, tom-uhl)은 처음 보면 아주 단순한 설정 파일처럼 보인다.
name = "my-app"
version = "1.0.0"
debug = true하지만 TOML은 단순히 “설정 파일 문법 하나가 더 생긴 것”이 아니다.
TOML이 등장한 배경에는 사람이 직접 읽고 수정하기 쉬우면서도, 프로그램이 정확하게 해석할 수 있는 설정 파일을 만들고 싶다는 요구가 있었다.
특히 기존의 INI(이니, I-N-I), JSON(제이슨, JAY-sən), YAML(얘멀, YAM-ul) 등이 각각 가지고 있던 한계를 해결하면서, 설정(Configuration, 컨피규레이션)에 적합한 언어를 목표로 만들어졌다.
1. TOML이란?
TOML(톰엘, tom-uhl)은 Tom's Obvious, Minimal Language의 약자다.
직역하면
Tom의 명확하고 최소한의 언어
정도다.
여기서 Tom은 TOML을 만든 Tom Preston-Werner(톰 프레스턴-워너)를 가리킨다.
TOML의 핵심 철학은 이름 그대로다.
보는 순간 무엇을 의미하는지 알 수 있어야 한다.
그래서 TOML은 복잡한 데이터 표현보다는 설정값을 사람이 작성하고 관리하는 것에 초점을 맞춘다.
예를 들어 다음과 같은 설정을 생각해 보자.
server_host = "localhost"
server_port = 8080
debug = true사람이 봐도 거의 별도의 설명이 필요 없다.
2. 그런데 왜 TOML이 필요했을까?
TOML을 이해하려면 먼저 기존 설정 파일의 문제를 알아야 한다.
과거에는 주로 다음과 같은 형식들이 사용됐다.
- INI(이니, I-N-I)
- XML(엑스엠엘, X-M-L)
- JSON(제이슨, JAY-sən)
- YAML(얘멀, YAM-ul)
각각 장단점이 있었다.
3. INI — 가장 단순하지만 구조에 한계가 있다
대표적인 INI(이니, I-N-I) 파일은 다음과 같다.
[server]
host=localhost
port=8080굉장히 읽기 쉽다.
그래서 Windows 설정 파일이나 오래된 애플리케이션에서 많이 사용됐다.
하지만 복잡한 구조를 표현하기 시작하면 문제가 생긴다.
4. JSON — 구조는 명확하지만 설정 파일로는 불편하다
JSON(제이슨, JAY-sən)은 데이터 구조를 표현하는 데 매우 훌륭하다.
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
}
}타입도 명확하다.
하지만 사람이 직접 수정하는 설정 파일에서는 불편한 부분이 있다.
5. YAML — 사람이 읽기는 좋지만 너무 많은 기능을 가지고 있다
YAML(얘멀, YAM-ul)은 설정 파일에서 굉장히 인기가 많다.
server:
host: localhost
port: 8080확실히 보기 좋다.
하지만 YAML은 상당히 강력한 언어다.
문제는 바로 이 강력함이다.
6. TOML이 선택한 방향
TOML(톰엘, tom-uhl)은 여기서 상당히 명확한 선택을 한다.
설정 파일에 필요한 기능만 제공하자.
7. TOML의 가장 기본적인 문법
name = "my-app"
version = "1.0.0"
debug = true
port = 80808. TOML의 중요한 특징 — 주석
TOML은 #으로 주석을 작성한다.
# 서버 설정
host = "localhost"
port = 80809. Table — TOML의 핵심
TOML에서 가장 중요한 개념 중 하나가 Table(테이블, TAY-bəl)이다.
[server]
host = "localhost"
port = 808010. 중첩 구조도 표현할 수 있다
[server.ssl]
enabled = true
port = 44311. 배열
ports = [8080, 8081, 8082]12. Inline Table
server = { host = "localhost", port = 8080 }13. Boolean
debug = true
production = false14. 문자열
name = "Tom"15. Multiline String
description = """
이것은 여러 줄에 걸쳐
작성할 수 있는 문자열입니다.
"""16. 날짜와 시간
TOML은 날짜/시간을 별도 타입으로 지원한다.
created_at = 2026-08-17T05:30:00Z17. Array of Tables
[[servers]]
name = "web01"
port = 808018. TOML은 JSON을 대체하려고 만들어진 것이 아니다
JSON(제이슨, JAY-sən)과 TOML(톰엘, tom-uhl)은 목적이 다르다.
19. TOML vs INI vs JSON vs YAML
| 항목 | INI | JSON | YAML | TOML |
|---|---|---|---|---|
| 사람이 읽기 | 매우 좋음 | 보통 | 매우 좋음 | 매우 좋음 |
| 자료형 | 약함 | 강함 | 강함 | 강함 |
20. TOML이 특히 주목받은 이유
Rust(러스트, rust) 생태계에서 Cargo.toml(카고 톰엘)이 사용되면서 널리 알려졌다.
21. Python에서도 TOML이 중요한 이유
Python(파이썬, PY-thon)에서는 pyproject.toml(파이프로젝트 톰엘)이 표준이 되고 있다.
22. TOML은 "설정 선언형 언어"에 가깝다
[server]
host = "0.0.0.0"
port = 808023. TOML의 또 다른 장점 — 명시성
port = 8080
debug = true24. 반대로 TOML에도 단점이 있다
- 매우 복잡한 데이터에는 불편
- YAML(얘멀, YAM-ul)보다 표현력 제한
- API 데이터 교환에는 부적합
25. TOML을 한눈에 이해하는 구조
TOML(톰엘, tom-uhl)
│
├── Key = Value
├── [Table]
├── [[Array of Tables]]
├── Array
└── Date / Time26. 최종 결론
TOML(톰엘, tom-uhl)은
사람이 직접 읽고 수정하는 설정(Configuration, 컨피규레이션)을 가장 명확하게 표현하기 위해 만들어진 작고 엄격한 언어다.