개발자

파이썬 앱 구성을 더 쉽게⋯TOML의 이해와 기본 활용

Serdar Yegulalp | InfoWorld 2022.08.03
소프트웨어 개발에서 흥미로운 반전은 가장 간단한 의사 결정이 때로는 가장 어려운 의사 결정이 되기도 한다는 것이다. 예를 들면 애플리케이션이나 서비스에 사용할 구성 파일 형식을 선택하는 것이 있다. JSON과 YAML, 2가지가 떠오를 것이다. 그러나 이해하기 쉽고 데이터 구조로 파싱하기도 비교적 쉬운 구성 파일 형식이 필요하다면 TOML도 고려할 필요가 있다.
 
ⓒ Getty Images Bank

TOML(Tom’s Obvious Minimal Language)은 구성 데이터 저장을 목적으로 만들어졌으며 JSON을 비롯한 다른 형식에는 없는 여러 기능을 지원한다. 예를 들어 JSON은 인라인 주석을 지원하지 않지만 TOML에서는 파이썬에서 하듯이 해시 기호를 앞에 붙이는 간단한 방법으로 주석을 넣을 수 있다. 그렇게 보면 파이썬 자체의 구성 표준이 TOML 쪽으로 기울고 있다는 점도 별로 놀라운 일은 아니다(pip에서 패키지 빌드를 위해 사용되는 pyproject.toml 참조).
 

TOML 형식의 기본 사항 

TOML 형식 파일은 키-값 쌍으로 구성되며 키는 문자열이고 값은 여러 형식 중 하나일 수 있다. 마이크로소프트 윈도우의 .ini 파일과 비슷한 면도 있지만 더 폭넓은 데이터 형식을 지원한다. 예를 들면 다음과 같다. 
 
name = "string"
integer = 3
float-value = 3.14159
boolean_value = true
"quoted ünicode key" = true
# this is a comment
data = "OK" # a comment after a key/value

키는 항상 문자열로 해석된다. 은 문자열, 정수, 실수, 부울, 다양한 날짜-시간 값, 그리고 배열과 인라인 테이블이라는 2가지 특수한 종류의 값이 될 수 있다. 해시 기호 뒤부터 그 라인의 끝까지는 모두 주석이다. 단, 키 또는 값 문자열 자체에 포함되는 해시 기호는 해당되지 않는다. 
 

TOML의 배열 

배열은 여러 값을 하나의 키에 저장하는 방법이다. 
 
int_values = [1, 2, 4, 8, 16]
strings = ["prime", "audio", "soup"]
mixed = [1, 2, "Three", 4.0]
multi-line = [
    "array",
    "of",
    "strings"
]

짐작할 수 있겠지만 배열에 포함되는 모든 값의 형식이 똑같을 필요는 없다. 또한 필요한 경우 정의에 여러 라인을 사용할 수 있다. 파이썬에서 배열은 목록에 직접 매핑된다. 
 

TOML의 테이블 

테이블은 TOML 파일에서 키-값 쌍 모음으로, 대괄호로 묶인 헤더 레이블이 있다. 파이썬에서 테이블은 중첩된 사전처럼 취급된다. 
 
[general]
make_network_connection = true
ping_time = 1200

[user]
default_name = "Anonymous"
ping_time = 1600

마이크로소프트 윈도우 .ini 파일 형식의 특징, 기능과 비슷하다. 키-값 쌍 그룹이 자체적인 별도의 네임스페이스를 가질 수 있다. 예를 들어 general과 user의 ping_time 값은 자체 네임스페이스로 구분된다. 즉, 서로 덮어쓰지 않는다. 
 

점으로 구분된 이름, 인라인 테이블, 테이블 배열 

TOML에서 테이블과 같은 네임스페이스 효과를 얻는 또 다른 방법은 점으로 구분된 이름을 사용하는 것이다. 앞선 예제를 다음과 같이 바꿀 수 있다. 
 
general.make_network_connection = true
general.ping_time = 1200

user.default_name = "Anonymous"
user.ping_time = 1600

인라인 테이블을 사용한 방법도 가능하다. 더 컴팩트한 스타일이고, 값 컬렉션에 따라서는 읽기도 더 편할 수 있다. 
 
general = {make_network_connection = true, ping_time = 1200}
user = {default_name = "Anonymous", ping_time = 1600}

인라인 테이블 형식은 표면적으로 파이썬 사전 선언과 비슷해 보일 수 있지만 그렇지 않다. :이 아닌 =을 사용해서 키/값 쌍을 표현한다. 테이블로 할 수 있는 또 다른 일은 테이블 배열을 만드는 것이다. 
 
[[movies]]
name = "Blade Runner"
year = 1982
[[movies]]
name = "Blade Runner 2049"
year = 2017

이렇게 하면 중첩된 구조가 만들어진다. 다음의 JSON을 사용한 방식과 비슷하다. 
 
movies = {
    {name: "Blade Runner", year: 1982},
    {name: "Blade Runner 2049", year: 2017}
}
 

파이썬에서 TOML 사용하기 

파이썬 생태계의 일부분에서 현재 TOML을 구성 언어로 사용하므로 파이썬의 TOML 지원도 확대되는 중이다. 파이썬 3.11부터 TOML의 표준 라이브러리 모듈인 tomllib는 TOML을 읽고 파이썬 객체(주로 사전)로 파싱할 수 있는 파이썬 네이티브 방법을 제공한다. 단, tomllib이 하는 일은 그게 전부고, 파이썬 객체를 TOLM 파일로 직렬화하지는 않으므로 TOML을 읽고 쓰기에 적합하지 않다. 읽기 작업 전용이다. 

파이썬 코어 팀이 TOML 쓰기를 tomllib 기능으로 추가할 수도 있지만 적어도 당분간 그럴 일은 없다. tomllib 모듈은 외부 라이브러리 없이 구성 파일에서 TOML을 흡수해 파싱하는 용도로 유용하다. 파이썬 객체를 TOML로 직렬화해야 한다면 다음 2가지 서드 파티 솔루션을 사용하면 된다. 
 
  • tomli-w는 파이썬 사전을 TOML로 쓰기 위한 최소 라이브러리다. 작성된 TOML에 대한 자동 유효성 확인 기능은 없으므로 필요하다면 tomllib으로 데이터를 로드해서 유효한지 확인해야 한다. 
  • tomlkit는 TOML 읽기와 쓰기 모두 가능하므로 특히 3.11 이전의 파이썬 버전을 지원해야 하는 경우(대부분이 해당) 가장 적합한 솔루션이라고 할 수 있다. 
 

TOML 주의 사항 

마지막으로, 특히 TOML을 수동으로 쓸 경우 2가지 주의 사항이 있다. 
 
  1. 키 이름을 사용 중인 언어에서 지원되지 않는 프로그램 변수 이름에 직접 매핑하는 경우를 주의해야 한다. 예를 들어 파이썬에서는 변수 이름에 밑줄을 사용할 수 있지만 대시는 사용할 수 없으므로 앞선 예에서 float-value 키는 이 이름을 가진 변수로 직접 매핑할 수 없다. 단, 파이썬 사전 키는 어느 문자열이든 될 수 있으므로 사전 안의 키에는 매핑이 가능하다. 
  2. TOML의 부울은 JSON 렌더링을 사용한다. 파이썬 특유의 True 및 False 대신 JSON의 true와 false를 사용하는 것을 예로 들 수 있다. TOML 라이브러리에서 이 부분을 자동으로 처리하지만 TOML을 수동으로 작성할 때는 주의해야 한다.

editor@itworld.co.kr
 Tags TOML 파이썬

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.