최근 수정 시각 : 2025-11-22 17:22:19

TOML



<rowcolor=#ffffff,#dddddd> 데이터 직렬화 형식과 설정 파일
{{{#!wiki style="min-height: calc(1.5em + 5px); margin: 0 -10px -5px"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
<colbgcolor=#4d5767,#4d5767><colcolor=#ffffff,#dddddd> 데이터 직렬화 형식 <colbgcolor=#4d5767,#4d5767><colcolor=#ffffff,#dddddd> 텍스트 CSV · JSON(NDJSON/JSON Lines) · XML
바이너리 flatbuffers · protobuf
설정 파일 텍스트 JSON(YAML · JSON5 · JSONC) · XML · INI(dotenv · EditorConfig · TOML) }}}}}}}}}
{{{#!wiki style="margin: -10px -10px"<tablealign=center><tablewidth=380><tablebordercolor=white,#1f2023> 파일:TOML 로고.svgTOML
Tom's Obvious Minimal Language }}}
<colbgcolor=#fff,#1f2023><colcolor=#181818,#D7D7D7> 최초 개발자 톰 프레스턴 워너
분류 데이터 양식
파일:홈페이지 아이콘.svg

1. 개요2. 구조
2.1. 문법
3. 특징4. 구현체5. 둘러보기

1. 개요

Tom's Obvious Minimal Language, TOML

INI의 문법에 영향을 받은 설정 파일 형식의 일종이다. 파일 확장자는 .toml이며, 아주 간단히 작성할 수 있기에 여러 소프트웨어 프로젝트에서 쓰이고 있다. 이름의 "Tom"은 창시자인 톰 프레스턴 워너 를 가리킨다.

같은 설정 파일인 YAML보다 훨씬 간단하며, 복잡한 구조를 간단히 표현할 수 있다는 이점이 존재한다. JuliaRust를 비롯한 프로그래밍 언어에서 프로젝트 내 패키지 환경을 나타낼 때 자주 사용된다.

2. 구조

2.1. 문법

key = "value"
형식의 간단한 문법을 사용한다. 이를 pair라고 하며, pair만 가지고는 XML, JSON이나 YAML같은 복잡한 구조를 표현할 수 없기에 추가적으로
[section]
을 사용해 간단한 네임스페이스를 만든다.

하지만 이렇게 해도 다른 설정 파일들에서의 하위 분류를 나타낼 수 없기에, TOML에서는 이렇게
[section.lowerSection]
하위 분류들을 점(.)으로 표시한다.

Pair를 하위 분류하려면 점(.)을 이런 식으로
key.lowerKey = "value"
코드를 작성하면 된다.

TOML에서는 주석을 지원한다. YAML같이 샵(#)을 쓰면 된다. 역시나 이것도 이런 식으로
# 나무위키, 모두가 가꾸어 나가는 지식의 나무. (이 줄은 전부 주석입니다)

Key = "Value" # 나무위키, 모두가 가꾸어 나가는 지식의 나무. (이것은 줄의 끝에 붙은 주석입니다.)

# 나무위키,
# 모두가 가꾸어 나가는
# 지식의 나무.
(여러 줄의 주석입니다)

Key = "# 나무위키, 모두가 가꾸어 나가는 지식의 나무. (이것은 주석이 아닙니다)"
작성을 하면 된다.

TOML은 문법이 아주 편하기 때문에, 점(.) 이후의 텍스트를 띄어 놓아도
Key. lowerKey # Key.lowerKey와 동일
Key. lowestKey # Key.lowestKey와 동일
별 문제가 생기지 않는다.

TOML에선 키의 종류가 있다. 이들은 일반 키, 쌍따옴표 키와 따옴표 키로 나뉜다.
Key1 = "저는 일반 키입니다. 저는 ASCII 문자들로만 이루어져 있습니다."
"Key2" = "저는 쌍따옴표 키입니다. 꼭 필요한 순간이 아니라면 일반 키를 써 주세요."
'Key3' = "저는 따옴표 키입니다. 쌍따옴표 키처럼 사용해 주세요."


TOML에서도 키의 규칙이 있다.
 = "일반 키를 공백으로 뇌두면 안 됩니다." # 유효하지 않습니다
" " = "따옴표나 쌍따옴표 키들은 공백으로 놔둬도 됩니다." # 유효합니다
보이는 바와 같이 TOML에서는 일반 키를 공백으로 놔두면 문서가 유효하지 않게 된다.

키를 여러번 반복해서 정의하면 유효하지 않게 된다. 쌍따옴표 키와 일반 키들은 같기 때문에 이들을 반복해서 정의하면(예시: 일반 키를 Key라고 특정 값으로 정의한 다음 쌍따옴표 키를 "Key"로 대응되는 일반 키와 같은 값으로 정의하였을 경우) 둘 다 유효하지 않게 된다.

TOML에서는 쌍따옴표 없이 ASCII 코드에 있는 숫자를 키와 같이 정의할 수 있다.
Key1 = 1212
Key2 = 55352
하지만 이렇게 하면 숫자로 정의된 키를 하위 분류할 수 없다.


TOML에서는 NaN, -Inf, Inf(+Inf)도 쓸 수 있다. 이렇게
Key1 = NaN 
Key2 = -Inf
Key3 =  Inf # +Inf와 동일
Key4 = +Inf # Inf와 동일
사용하면 된다.

리터럴도 있다. 2개(true, false)가 있으며, 이렇게
Key1 = true
Key2 = false
이용하면 된다.
역시나 이것도 하위 분류가 불가능하다. JSON이랑 좀 비슷한 것 같다

3. 특징

Null이 없다.#30 Null을 나타내고 싶다면 해당 키-값 자체를 비우는 방법이 있다.

키나 헤더의 경우 숫자로 시작하거나 숫자로 해석될 수 있더라도 반드시 문자열로 인식된다. 가령
[1234]
5678 = "value"
와 같은 경우 1234, 5678은 반드시 문자열로 해석되어 JSON에 대응하면
#!syntax json
{
  "1234": {
    "5678": "value"
  }
}
와 비슷하게 인식된다.

4. 구현체

  • smol-toml - 기존의 toml 라이브러리를 개선하고자 빠른 성능으로 재작성된 TypeScript 라이브러리. 기본적으로 JavaScript 정수 허용 범위 이상의 값은 파싱에 실패하며, 이러한 입력을 파싱할 필요가 있을 경우 BigInt 파싱 옵션을 켜줘야 한다. 날짜 및 시간, 시간 없는 날짜, 날짜 없는 시간, 타임존 고정 날짜 및 시간 등등 각종 경우에 대한 리터럴을 모두 지원하는 TOML 특성상 '날짜 없는 시간' 같은 부분적인 정보를 js 표준 Date만으로는 다루기 어려워 TomlDate를 반환한다.#

5. 둘러보기