안녕하세요! 개발자라면 누구나 한 번쯤은 마주쳤을 YAML. Kubernetes 설정부터 GitHub Actions 워크플로우, Ansible 플레이북까지 정말 다양한 곳에서 사용되고 있죠. 🧐
그런데 혹시 YAML에도 여러 버전이 있다는 사실, 알고 계셨나요? 특히 특정 버전의 미묘한 차이 때문에 예상치 못한 오류를 경험하기도 합니다. 오늘은 YAML의 탄생부터 현재 표준인 1.2 버전까지, 그 전체적인 맥락과 핵심적인 차이점을 샅샅이 파헤쳐 보겠습니다!

YAML의 탄생: "마크업 언어가 아니라고?" 🤔
YAML의 역사는 2001년으로 거슬러 올라갑니다. Clark Evans가 처음 제안하고 Ingy döt Net, Oren Ben-Kiki와 함께 개발을 시작했죠.
- 초기 이름: 처음에는 Yet Another Markup Language("또 다른 마크업 언어")라는 이름을 가졌어요. 당시 복잡했던 XML의 대안으로, 사람이 좀 더 쉽게 읽고 쓸 수 있는 마크업 언어를 지향했기 때문입니다.
- 이름의 변화💡: 하지만 개발 과정에서 YAML이 문서의 구조를 표현하는 '마크업'보다는 데이터를 표현하는 '데이터 직렬화'에 더 중점을 둔다는 철학이 명확해졌습니다. 그래서 YAML Ain't Markup Language("YAML은 마크업 언어가 아니다")라는 재귀적인 약어로 이름을 변경했죠. 이 이름 자체가 YAML의 핵심 정체성(데이터 중심!)을 보여줍니다.
- 영감의 원천 📚: YAML은 C, Python, Perl 같은 프로그래밍 언어와 이메일 형식(RFC 822)에서 많은 영감을 받았습니다. 특히 파이썬처럼 들여쓰기로 데이터의 계층 구조를 표현하는 방식은 YAML의 가장 큰 특징 중 하나입니다.
버전별 핵심 특징 파헤치기 🚀
이제 각 버전이 어떤 특징을 가지고 어떻게 발전해왔는지 살펴보겠습니다.
YAML 1.0 (2004년) - 👶 모든 것의 시작
- 최초의 공식 명세(specification)입니다.
- YAML의 근간을 이루는 기본 데이터 구조를 정의했습니다.
- 스칼라(Scalars): 문자열, 숫자, 불리언 등 단일 값
- 시퀀스(Sequences): 리스트 또는 배열 (e.g., - item1)
- 맵(Mappings): 해시 또는 딕셔너리 (e.g., key: value)
- 들여쓰기를 통해 데이터 계층을 표현하는 핵심 문법을 확립하며 YAML의 정체성을 만들었습니다.
YAML 1.1 (2005년) - 🏃♂️ 널리 퍼졌지만, 약간의 혼란
- 가장 오랫동안, 그리고 가장 널리 채택되었던 버전입니다. 많은 오래된 라이브러리나 도구가 이 버전을 기반으로 만들어졌습니다.
- UTF-8, UTF-16과 같은 문자 인코딩 지원을 명확히 했습니다.
- 다양한 이스케이프 시퀀스(\n, \t 등)를 지원하며 문자열 표현 능력을 확장했습니다.
⚠️ 하지만 YAML 1.1에는 한 가지 중요한 '함정'이 있었습니다. 바로 특정 문자열을 불리언(Boolean, true/false)으로 너무 관대하게 해석한다는 점입니다.
예를 들어, yes, no, on, off 같은 단어들을 모두 불리언으로 자동 변환했습니다.
YAML 1.2 (2009년) - 👑 현재의 표준, 혼란의 종결자
현재 우리가 사용하는 대부분의 최신 도구들이 따르는 사실상의 표준(de facto standard) 버전입니다. YAML 1.1의 문제점들을 해결하고 훨씬 더 예측 가능하고 안정적으로 발전했습니다.
가장 큰 변화: JSON과의 완벽한 호환성 🤝
YAML 1.2의 가장 중요한 특징은 JSON을 공식적인 하위 집합(subset)으로 채택했다는 것입니다. 이게 무슨 의미일까요?
"모든 유효한 JSON 문서는 그 자체로 유효한 YAML 1.2 문서다."
이 덕분에 JSON 데이터를 YAML 파서로 그대로 읽거나, 두 형식 간의 변환이 매우 쉬워졌습니다.
// I'm a valid JSON file.
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["History", "Math"]
}
위 JSON 데이터는 별도의 변환 없이 완벽하게 유효한 YAML 1.2 데이터이기도 합니다. 정말 편리하죠!
문법 정리 및 모호성 해결: 가장 중요한 차이점! ✨
YAML 1.2는 1.1의 가장 큰 문제였던 '지나치게 관대한 불리언 해석' 문제를 해결했습니다.
🤔 여기서 잠깐, 이게 왜 문제였을까요? 예를 들어, 국가 코드를 저장한다고 상상해보세요. 노르웨이의 국가 코드는 NO입니다. 만약 YAML 1.1 파서를 사용한다면, 이 NO를 문자열이 아닌 불리언 값 false로 해석해버리는 끔찍한 버그가 발생할 수 있습니다.
👇 코드로 직접 비교해봅시다.
# data.yaml
country_code: NO
all_inclusive: YES
power: on
이 파일을 각 버전의 파서로 읽으면 어떻게 될까요?
- YAML 1.1 파서의 해석 결과 (Raw Data) 👎보시다시피, 우리의 의도와는 전혀 다르게 모든 값을 불리언으로 바꿔버렸습니다. 이는 심각한 데이터 불일치를 유발할 수 있습니다.
- { "country_code": false, "all_inclusive": true, "power": true }
- YAML 1.2 파서의 해석 결과 (Raw Data) 👍YAML 1.2는 true와 false만 명시적인 불리언으로 인식하고, 나머지는 모두 문자열로 안전하게 처리합니다. 훨씬 더 예측 가능하고 안전하죠! 이것이 바로 우리가 YAML 1.2를 사용해야 하는 핵심적인 이유입니다.
- { "country_code": "NO", "all_inclusive": "YES", "power": "on" }
YAML 1.2.1 & 1.2.2 (2021년) - ✍️ 오타 수정 및 명확화
1.2 버전이 나온 지 약 12년 만에 개정판이 나왔지만, 새로운 기능 추가는 전혀 없습니다. 기존 1.2 명세의 오타를 수정하거나, 애매했던 설명을 더 명확하게 다듬는 등 문서 자체를 개선하는 데 초점을 맞춘 유지보수 릴리스입니다. 따라서 우리는 여전히 YAML 1.2를 기준으로 생각하면 됩니다.
한눈에 보는 요약 📊
| 버전 | 출시일 | 주요 특징 |
| 1.0 | 2004년 1월 | 👶 최초 공식 사양, 기본 구조 정의 |
| 1.1 | 2025년 1월 | 🏃♂️ 인코딩 명확화, 하지만 불리언 해석에 모호성 존재 |
| 1.2 | 2009년 7월 | 👑 현재 표준, JSON과 완벽 호환, 모호성 해결로 안정성 UP |
| 1.2.2 | 2021년 10월 | ✨ 기능 변경 없이 사양 문서의 명확성 개선 |
결론: 우리는 YAML 1.2의 시대에 살고 있다! ✅
결론적으로, 현재 YAML을 사용한다면 반드시 YAML 1.2 버전을 기준으로 이해하고 작성하는 것이 좋습니다. 다행히 Kubernetes, Ansible, GitHub Actions, Docker Compose 등 우리가 사용하는 대부분의 최신 도구들은 YAML 1.2 사양을 충실히 따르고 있습니다.
이제 YAML 파일에서 true/false가 아닌 yes, on 같은 값을 보면 "아, 저건 YAML 1.1 스타일의 유물이구나!" 하고 생각할 수 있겠죠? 우리가 사용하는 도구의 역사를 이해하면 얘기치 못한 버그를 피하고 더 견고한 시스템을 만드는 데 큰 도움이 됩니다. 😊
'일반IT' 카테고리의 다른 글
| 버전 숫자, 그냥 올리셨나요? 1.0.0의 비밀, 아무도 알려주지 않는 룰 🤫 (0) | 2025.11.11 |
|---|---|
| 인터넷 주소가 3개나 된다고? 😱 IP, MAC, 포트가 머야!? (0) | 2025.11.05 |
| Slack, 무료로 쓸까? 유료로 쓸까? 완벽 비교 분석! 🧐 (1) | 2025.10.05 |
| 바이브코딩으로 광고 수익 창출을 위한 정적 웹사이트 기능 100가지 (3) | 2025.09.21 |
| 🎮 렉 없는 게임의 비밀? P2P 통신과 NAT 통과, 릴레이 서버의 마법! ✨ (0) | 2025.09.20 |