YAML 은 스칼라 타입을 알아서 정하고, 덮어쓸 수도 있다
따옴표 없이 쓴 port: 8000 은 정수로 읽혀. port: "8000" 이라고 쓰면 문자열이 되고. 즉 파서가 생김새만 보고 타입을 찍는 거야. 편하라고 만든 이 기능이 동시에 YAML 에서 제일 유명한 함정이기도 해.
다섯 스칼라 스타일
- 따옴표 없음 (plain) —
name: Pippa. 파서가 타입을 찍어. - 작은따옴표 —
name: 'Pippa'. 무조건 문자열이야. 백슬래시도 글자 그대로 남고. - 큰따옴표 —
name: "Pippa". 역시 무조건 문자열인데, JSON 식 escape (\n,\t,\u00e9) 를 받아줘. - Literal block (
|) — 여러 줄을 담고 줄바꿈을 그대로 지켜. - Folded block (
>) — 여러 줄을 담되 줄을 스페이스로 이어붙여.
Boolean, Norway 문제
YAML 1.1 은 따옴표 없는 스물두 개의 문자열을 boolean 으로 읽어. 파서 상당수가 아직 이걸 기본으로 쓰고, 1.22 이전 Kubernetes 도 여기 포함돼. 목록은 이래. y, Y, yes, Yes, YES, n, N, no, No, NO, true, True, TRUE, false, False, FALSE, on, On, ON, off, Off, OFF. 그래서 country: NO 라고 쓰면 country: False 가 돼버려. 해결은 하나야. 키워드처럼 생긴 문자열 값은 무조건 따옴표로 감싸. country: "NO" 라고 쓰면 문자열로 남아.
Null
따옴표 없이 쓰면 null 로 읽히는 형태가 넷 있어. null, Null, NULL, ~. 콜론 뒤에 아무것도 안 쓴 빈 값도 null 이고. 'null' 이라는 글자 자체가 필요하면 따옴표로 감싸서 'null' 이라고 써.
Norway 문제 (실제 사례): 어떤 config 파일이 국가를 두 글자 ISO 코드로 나열했어.
countries: [GB, IE, NO, DE] 이렇게. YAML 1.1 파서가 NO 를 False 로 바꿔버렸지. 노르웨이가 목록에서 통째로 사라졌고, 예약 시스템은 노르웨이 주소로 메일을 안 보내기 시작했어. 원인을 찾는 데 몇 주가 걸렸고. 키워드로 잘못 읽힐 여지가 있는 건 전부 따옴표로 감싸.