# 설정 파일 비교 및 활용: `.toml`과 `.ini` --- ## 1. 설정 파일 개요 - `.toml` 파일과 `.ini` 파일은 모두 소프트웨어에서 설정 정보를 저장하는 데 널리 사용되는 **텍스트 기반 구성 파일** 입니다. - 사람(`man`)과 기계(`machine`)가 모두 읽기 쉽도록 설계되어 있으며, 다양한 운영체제와 프로그래밍 언어에서 활용됩니다. <br /> --- ## 2. 공통점과 차이점 ### 2.1. 공통점 - 모두 **키-값 쌍 (`key-value pair`)** 형태로 데이터를 저장합니다. - **섹션 구분자**를 사용해 설정 항목을 그룹화할 수 있습니다. - 텍스트 기반이므로 **사람이 직접 읽고 편집** 할 수 있습니다. <br /> ### 2.2. 차이점 - | 항목 | `.ini` 파일 | `.toml` 파일 | |------------------|------------------------------------------|----------------------------------------| | 문법 규격 | 비공식, 다양한 변형 존재 | 엄격한 공식 명세 존재 ([TOML 공식 문서](https://toml.io)) | | 자료형 지원 | 대부분 문자열 | 문자열, 숫자, 날짜, 배열, 불리언 등 지원 | | 중첩 구조 | 단순 섹션만 가능 | 테이블, 중첩 테이블, 배열 테이블 가능 | | 주석 | `;`, `#` 모두 가능 | `#`만 가능 | | 사용 예시 | 윈도우 설정 파일, 오래된 소프트웨어 | Rust의 `Cargo.toml`, Python의 `pyproject.toml` 등 | <br /> --- ## 3. `.ini` vs `.toml` 예제 비교 ### 3.1. `.ini` 예제 - > ini ``` ; 설정 파일 예제 [database] user = root password = 1234 [server] host = localhost port = 8080 ``` <br /> ### 3.2. `.toml` 예제 - > toml ``` # 설정 파일 예제 title = "TOML 예제" count = 1000 enabled = true [database] user = "root" password = "1234" [server] host = "localhost" port = 8080 [[products]] name = "Apple" price = 1.2 [[products]] name = "Orange" price = 0.8 ``` <br /> --- ## 4. `.toml`에서 지원하는 데이터 타입 - `.toml`은 다양한 데이터 타입을 명확하게 지원합니다. - 이는 구조화된 설정이 필요한 프로젝트에서 매우 유리합니다. - | 타입 | 예시 | 설명 | |--------------|-----------------------------------|------| | 문자열 | `"Hello"` / `'World'` | 큰따옴표 또는 작은따옴표 사용 가능 | | 멀티라인 문자열 | `"""여러 줄"""`, `'''여러 줄'''` | 여러 줄 문자열 지원 | | 정수 | `42`, `-7`, `1_000` | 밑줄 `_`로 가독성 향상 가능 | | 실수 | `3.14`, `-0.01`, `1e6` | 부동소수점 및 지수 표기 | | 불리언 | `true`, `false` | 소문자만 허용 | | 날짜/시간 | `1979-05-27T07:32:00Z` | RFC 3339 형식 사용 | | 배열 | `[1, 2, 3]`, `["a", "b", "c"]` | 혼합 타입은 허용되지 않음 | | 테이블 | `[section]` | 키-값 그룹 정의 | | 중첩 테이블 | `[parent.child]` | 점(`.`)으로 중첩 표현 | | 배열 테이블 | `[[products]]` | 동일 형식의 객체 배열 표현 | <br /> --- ## 5. `Python`에서 `.toml` 활용 예제 - `Python`에서는 `tomllib`(3.11 이상) 또는 `tomli`(3.10 이하 설치 필요) 모듈을 사용하여 `TOML` 파일을 파싱할 수 있습니다. <br /> ### 5.1. TOML 파일 예 (`config.toml`) - > toml ``` title = "TOML 예제" count = 1000 enabled = true [database] user = "admin" port = 5432 [[products]] name = "Apple" price = 1.2 [[products]] name = "Orange" price = 0.8 ``` <br /> ### 5.2. `Python` 코드 - > python ``` import tomllib with open("config.toml", "rb") as f: data = tomllib.load(f) print(data["title"]) # TOML 예제 print(data["database"]["user"]) # admin print(data["products"][0]["name"]) # Apple ``` - > 💡 `Python` 3.10 이하는 `pip install tomli`로 설치하여 사용해야 합니다. <br /> --- ## 6. `Rust`에서 `.toml` 활용 예제 - `Rust`에서는 `toml` 크레이트와 `serde`를 함께 사용하여 구조체에 `TOML` 데이터를 직접 매핑할 수 있습니다. ### 6.1. `Cargo.toml`에 추가 - > toml ``` [dependencies] toml = "0.8" serde = { version = "1.0", features = ["derive"] } ``` <br /> ### 6.2. `Rust` 코드 - > rust ``` use serde::Deserialize; #[derive(Debug, Deserialize)] struct Config { title: String, count: i64, enabled: bool, database: Database, products: Vec<Product>, } #[derive(Debug, Deserialize)] struct Database { user: String, port: u16, } #[derive(Debug, Deserialize)] struct Product { name: String, price: f64, } fn main() { let toml_str = std::fs::read_to_string("config.toml").unwrap(); let config: Config = toml::from_str(&toml_str).unwrap(); println!("Title: {}", config.title); println!("DB User: {}", config.database.user); println!("First product: {}", config.products[0].name); } ``` <br /> --- ## 7. 정리 `.ini`는 단순한 구조의 설정 파일에 적합하고, `.toml`은 타입 명시성과 구조화가 필요한 복잡한 설정에 적합합니다. - 특히 `Python`, `Rust` 같은 언어에서는 `.toml`을 표준 설정 형식으로 채택하고 있어 앞으로의 사용 빈도는 더욱 높아질 것입니다.