YAML: 어수선함 없는 설정 파일
YAML이 왜 설정 파일의 표준이 됐고 함정을 피하는 법.
모든 Kubernetes 매니페스트. 모든 GitHub Actions 워크플로. 모든 Docker Compose 파일.
YAML이 설정에 어디든 있어. 읽기 쉽고, 유연하고, 놀라운 특성이 좀 있어.
왜 YAML?
JSON은 엄격해: 쌍따옴표, 주석 없음, 마지막 쉼표 없음.
YAML은 관대해: 최소 문법, 주석 허용, 인간 읽기 쉬워.
# YAML 설정
database:
host: localhost
port: 5432
name: myapp
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
같은 데이터, YAML에서 소음 덜해.
기본
키-값 쌍:
name: John
age: 30
중첩 구조 (탭 아니라 공백 써):
person:
name: John
age: 30
리스트:
colors:
- red
- green
- blue
인라인 리스트와 객체:
colors: [red, green, blue]
person: {name: John, age: 30}
Norway 문제
country: NO
NO가 뭐야? 불린 false. YAML이 NO, Yes, on, off, 다른 걸 불린으로 해석해.
노르웨이 국가 코드가 false가 돼. 설정이 신비롭게 깨져.
고치기: 불린으로 해석될 수 있는 문자열은 따옴표로.
country: "NO"
여러 줄 문자열 문제
description: This is a long
description that continues
두 줄이야 아니면 "that continues"가 들여쓰기된 한 줄? YAML 파서에 달렸어.
명시적 여러 줄:
# 리터럴 (개행 보존)
description: |
Line one
Line two
# 접힌 (줄 결합)
description: >
This is one long
line when parsed
들여쓰기가 중요해
두 공백. 탭 아니야. 한 공백 아니야. 세 공백 아니야.
# 맞아
parent:
child: value
# 틀려 - 탭 문자
parent:
child: value
탭과 공백 섞으면 YAML을 조용히 깨뜨려. 에디터를 공백 쓰도록 설정해.
숫자 해석
version: 1.10
문자열 "1.10"이야 숫자 1.1? 대부분의 파서가 1.1로 해석해.
부동소수점 수학이 또 공격해. 버전 번호는 따옴표로.
version: "1.10"
앵커와 별명
YAML이 반복되는 콘텐츠를 참조할 수 있어:
defaults: &defaults
timeout: 30
retries: 3
production:
<<: *defaults
timeout: 60
중복 줄이는 데 강력해. 과도하게 하면 혼란스러워.
YAML 검증
YAML의 유연성은 많은 게 유효해 보이지만 아닌 걸 의미해.
- 에디터에서 린터 써
- 가능하면 스키마에 대해 검증
- JSON으로 변환해서 파서가 실제로 뭘 해석했는지 봐
설정이 작동 안 하면 네가 쓴 게 아니라 파서가 보는 걸 확인해.
YAML vs JSON vs TOML
YAML: 인간 읽기 쉬워, 많은 기능, 특성 있는 엣지 케이스.
JSON: 엄격해, 단순해, 널리 지원돼, 장황해.
TOML: 명시적이야, 놀람 적어, 설정에 인기 얻고 있어.
머신 간 데이터는 JSON이 안전해. 인간 편집 설정은 함정을 알면 YAML이 작동해.
YAML은 엄격함보다 가독성을 우선해. 그 트레이드오프가 엣지 케이스를 만들어. 불린이나 숫자처럼 보이는 문자열은 따옴표로 하고, 명시적 여러 줄 문법 쓰고, 배포 전 검증해.