YAML, 정말로 구식 포맷일까?

by DD
4일 전
조회수 4

과거 YAML 1.1의 암시적 타입 변환(Implicit Typing) 문제로 인한 오해를 지적함

최신 YAML 1.2 사양은 안정성과 예측 가능성(Stability & Predictability)을 크게 향상시켰음을 강조함

PyYAML의 한계를 극복한 Rust 기반의 py-yaml12와 같은 현대적 파서의 등장을 조명함

TOML은 단순한 설정에 적합하나, 복잡한 계층 구조에는 YAML 1.2의 유연성(Flexibility)이 더 우수함을 주장함

YAML 1.1의 '암시적 타입 변환' 문제와 오해

과거 YAML 1.1의 가장 큰 문제점이었던 암시적 타입 변환(Implicit Typing)은 'Norway'를 boolean 'false'로 해석하는 등 예측 불가능한 동작을 야기했습니다. 이는 국가 코드, 변수명 등에서 심각한 버그를 유발했으며, 특히 데이터 과학(Data Science)머신러닝(ML) 분야에서 혼란을 가중시켰습니다. 이러한 문제는 YAML 자체의 설계 결함이라기보다는, 구버전 사양(YAML 1.1)과 이를 따르는 파서들의 한계로 지적됩니다.

YAML 1.2 사양의 개선점과 안전성 강화

YAML 1.2 사양은 이전 버전의 문제점을 해결하기 위해 명시적 타입 처리(Explicit Typing)를 강화했습니다. 'yes', 'no', 'on', 'off' 등은 더 이상 boolean으로 자동 변환되지 않으며, 십진수 외의 숫자 형식(예: 22:22)도 제거되었습니다. 또한, JSON과의 호환성(JSON Compatibility)을 높여 모든 유효한 JSON이 YAML 1.2로 동일하게 파싱되도록 했습니다. 이러한 변화는 보안 취약점(Security Vulnerabilities)을 줄이고 예측 가능성을 높이는 데 기여했습니다.

현대적 YAML 파서: py-yaml12와 ruamel.yaml

기존의 PyYAML은 YAML 1.1 기반으로 동작하며 성능 및 보안 이슈가 지적되어 왔습니다. 이를 해결하기 위해 Rust로 구현된 py-yaml12는 YAML 1.2를 완벽 지원하며 C 확장 라이브러리 수준의 빠른 성능(High Performance)을 제공합니다. 또한, ruamel.yaml은 주석 및 키 순서 보존 등 고급 기능을 지원하지만, 순수 Python 구현으로 인해 속도 면에서는 py-yaml12에 비해 느릴 수 있습니다. 이들 라이브러리는 안전한 기본값(Safe Defaults)을 제공하여 임의 코드 실행 위험을 차단합니다.

복잡한 계층 구조에서의 YAML vs TOML

TOML은 단순하고 평탄한 설정 파일에는 명확하고 간결하지만, 복잡한 중첩 구조(Complex Nested Structures)를 표현할 때는 가독성이 떨어집니다. YAML은 들여쓰기 기반의 계층 구조 표현에 강점을 가지며, 데이터 재사용(Data Reuse)을 위한 앵커(Anchor)와 별칭(Alias) 기능도 제공합니다. 글에서는 동일한 데이터를 표현할 때 TOML이 YAML보다 약 50% 더 많은 문자를 사용한다고 지적하며, 의미론적 들여쓰기(Semantic Indentation)가 파일의 가독성과 편집 용이성을 높인다고 주장합니다.

In Defense of YAML