# 설정 파일 비교 및 활용: `.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`을 표준 설정 형식으로 채택하고 있어 앞으로의 사용 빈도는 더욱 높아질 것입니다.