YAML은 Docker, Kubernetes, CI/CD 파이프라인 등 수많은 도구의 설정 포맷입니다. 사람에게 친화적인 문법이지만 놀라울 정도로 실수하기 쉽습니다.
YAML 사용처
- Docker Compose
- Kubernetes 매니페스트
- GitHub Actions / GitLab CI
- Ansible 플레이북
- 설정 파일
기본 문법 규칙
들여쓰기
YAML은 공백(탭 불가)으로 들여쓰기합니다:
# ✅ Correct (2-space indentation)
server:
host: localhost
port: 8080
database:
name: myapp
pool: 10
# ❌ Wrong (tab characters or inconsistent spaces)
server:
host: localhost # Tab character - INVALID!
port: 8080 # 3 spaces - inconsistent!키-값 쌍
콜론과 공백으로 구분합니다:
# ✅ Correct
name: John Doe
port: 8080
# ❌ Wrong - missing space after colon
name:John Doe여러 줄 문자열
YAML은 두 가지 블록 스칼라 스타일을 제공합니다:
# | (literal block) - preserves newlines
description: |
This is line one.
This is line two.
Each newline is preserved.
# > (folded block) - folds newlines to spaces
description: >
This is a long paragraph
that will be joined into
a single line.데이터 타입
| 타입 | 문법 | 예시 |
|---|---|---|
| String | plain, "quoted", 'quoted' | name: John |
| Integer | 42, 0xFF, 0o77 | port: 8080 |
| Float | 3.14, .inf, .nan | pi: 3.14159 |
| Boolean | true/false | debug: true |
| Null | null, ~, (empty) | value: null |
| Date | YYYY-MM-DD | date: 2026-02-10 |
"노르웨이 문제"
YAML 1.1에서 `NO`는 boolean `false`로 해석됩니다. 따옴표를 사용하세요:
# ❌ YAML 1.1 interprets these as booleans!
country: NO # → false
answer: yes # → true
switch: on # → true
# ✅ Fix: quote the values
country: "NO" # → string "NO"
answer: "yes" # → string "yes"
switch: "on" # → string "on"컬렉션
# List (sequence)
fruits:
- apple
- banana
- cherry
# Nested map
database:
host: localhost
port: 5432
credentials:
user: admin
password: secret
# Inline / Flow style
fruits: [apple, banana, cherry]
point: {x: 10, y: 20}흔한 10가지 YAML 오류
| # | 오류 | 원인 | 해결 |
|---|---|---|---|
| 1 | 탭 문자 오류 | 탭으로 들여쓰기 | 공백으로 교체 |
| 2 | 일관성 없는 들여쓰기 | 2칸과 4칸 혼용 | 일관된 들여쓰기 사용 |
| 3 | 콜론 뒤 공백 누락 | `key:value`로 작성 | 콜론 뒤에 공백 추가 |
| 4 | 따옴표 없는 특수문자 | :나 #을 포함한 값에 따옴표 없음 | 특수문자 포함 문자열에 따옴표 |
| 5 | 불리언 강제 변환 | yes/no가 불리언으로 | 따옴표로 감싸기 |
| 6 | 콜론 포함 문자열 | URL의 두 번째 콜론에서 끊김 | 전체 값을 따옴표로 |
| 7 | 중복 키 | 같은 키가 두 번 등장 | 중복 키 제거 |
| 8 | 후행 공백 | 값 뒤의 보이지 않는 공백 | 편집기에서 후행 공백 제거 |
| 9 | 리스트 들여쓰기 오류 | 리스트 항목이 부모 키와 정렬 안 됨 | 들여쓰기 수준 맞추기 |
| 10 | 문서 구분자 누락 | 여러 문서에 `---` 없음 | `---` 추가 |
YAML vs JSON vs TOML
| 기능 | YAML | JSON | TOML |
|---|---|---|---|
| Comments | # support | None | # support |
| Multi-line strings | | and > | \\n only | """ triple quotes |
| Data types | Rich (dates, etc.) | Basic (6 types) | Rich (dates, etc.) |
| Readability | High | Medium | High |
| Machine parsing | Complex | Simple | Medium |
| Best for | Config files | APIs, data exchange | App config |
모범 사례
- CI/CD에서 YAML 린터 사용
- 편집기에서 공백 문자 표시
- 2칸 들여쓰기 사용
- 오해될 수 있는 문자열에 따옴표
- 스키마 검증 사용
- 파일을 작고 모듈화
FAQ
YAML에서 탭을 사용할 수 있나요?
아니요. YAML은 들여쓰기에 탭 문자를 엄격히 금지합니다.
작은따옴표와 큰따옴표의 차이는?
작은따옴표는 리터럴 문자열, 큰따옴표는 이스케이프 시퀀스를 허용합니다.
YAML에서 null을 표현하려면?
`null`, `~`, 또는 빈 값을 사용합니다.
왜 YAML은 "NO"를 false로 처리하나요?
YAML 1.1 사양이 yes/no 등을 불리언으로 처리하기 때문입니다. YAML 1.2에서는 true/false만 인식합니다.