YAML은 쓰기는 쉽지만 미묘하게 틀리기도 쉽습니다. 탭 하나, 어긋난 대시 하나, 따옴표 없는 값 하나가 CI 파이프라인이나 쿠버네티스 매니페스트, 컴포즈 파일의 의미를 바꿀 수 있습니다. 이 포매터는 yaml 라이브러리(YAML 1.2 코어 스키마)로 텍스트를 읽어 공백 2칸 또는 4칸으로 다시 들여쓰고, 입력하는 동안 결과를 옆에 바로 보여 줍니다. 데이터를 읽었다가 다시 덤프하는 방식과 달리 문서 자체를 고쳐 쓰기 때문에, 주석, 앵커, 별칭, 병합 키, 따옴표 모양, --- 구분선이 쓴 자리에 그대로 남습니다.
두 번째 탭은 같은 데이터를 트리로 보여 주며, 이때 병합 키와 별칭은 이미 펼쳐진 상태입니다. 도커 컴포즈나 레일스 설정 로더 같은 소비 쪽이 실제로 받게 될 값을 눈으로 확인할 수 있고, 키를 누르면 그 값의 JSONPath가 복사됩니다. 편집기 아래에는 크기, 문서 수, 키, 객체, 배열, 깊이, 병합 키 개수가 표시됩니다.
YAML이 깨져 있으면 오류 메시지에 줄과 열이 나오고, 편집기에서 그 줄이 강조되며 오류로 이동 버튼이 커서를 그 자리로 옮겨 줍니다. 모든 처리는 브라우저 탭 안에서 이루어지고 서버로 전송되지 않습니다. 입력은 20MiB까지 받고, ---로 나뉜 여러 문서도 처리합니다.
사용 방법
YAML 붙여 넣기, 예제 고르기, 파일 열기
입력 편집기에 직접 쓰거나 붙여 넣고,
.yaml·.yml파일을 끌어다 놓거나 파일 열기를 누릅니다. 예제 칩으로 API 응답, 앵커와 병합 키 파일, 엣지 케이스, 일부러 깨 둔 문법 오류 파일을 불러올 수 있습니다.공백 2칸 또는 4칸 선택
들여쓰기 스위치를 바꾸면 문서 전체가 한 번에 다시 출력됩니다. 매핑 안의 시퀀스도 같은 폭으로 들여쓰며, 입력하는 동안 결과가 갱신됩니다.
정렬됨 탭과 트리 탭 확인
정렬됨 탭은 주석이 그대로 남은 재들여쓰기 결과입니다. 트리 탭은 병합 키와 별칭을 펼친 뒤의 값을 보여 주며, 대부분의 로더가 파일을 읽는 방식과 같습니다. 트리의 키를 누르면 JSONPath가 복사됩니다.
강조된 줄에서 오류 고치기
문제가 있는 줄이 편집기에 표시되고 메시지에 줄과 열이 적힙니다. 오류로 이동을 누르면 커서가 그 위치로 갑니다. 입력이 다시 올바르게 읽힐 때까지는 마지막으로 성공한 결과가 흐리게 남아 있습니다.
복사, 다운로드, 결과를 입력으로 쓰기
정리된 텍스트를 복사하거나
.yaml파일로 내려받습니다. 결과를 입력으로 쓰기를 누르면 정리된 텍스트가 편집기로 옮겨져 깨끗한 버전에서 계속 고칠 수 있습니다.
작동 원리
그대로 두는 것과 다시 쓰는 것
포매터는 데이터만 덤프하지 않고 주석까지 붙어 있는 파싱된 문서 트리를 그대로 출력합니다. 그래서 name: api # the name 같은 줄이 주석을 잃지 않고 name: api # the name으로 돌아옵니다. 키 순서는 바뀌지 않으며, 출력기에 줄 접기를 끄도록 지시했기 때문에 300자짜리 평문 스칼라도 한 줄로 남습니다.
공백, 들여쓰기, 흐름 컬렉션은 정규화됩니다. 스칼라는 숫자 표기까지 쓴 그대로 출력되므로, 정리해도 값이나 표기가 바뀌지 않습니다.
| 원문 | 정리 결과 | 이유 |
|---|---|---|
| # 주석, name: x # note | 텍스트 그대로, 주석 앞 공백 한 칸 | 주석은 문서 트리의 일부 |
| &base 와 <<: *base | 그대로 | 앵커, 별칭, 병합 키는 펼치지 않고 유지 |
| '작은따옴표' 와 "큰따옴표" | 그대로 | 따옴표 모양 보존 |
| [a,b, c] | [a, b, c] | 흐름 컬렉션은 쉼표 뒤 공백 한 칸 |
| 0x1F, 1e3, +5, 007, .INF | 그대로 | 숫자는 쓴 표기를 유지 |
| 1.50 | 1.50 | 소수의 끝자리 0은 유지 |
| 12345678901234567890 | 12345678901234567890 | 큰 정수는 BigInt로 읽어 정확히 유지 |
| 빈 줄 세 개 | 빈 줄 한 개 | 연속된 빈 줄은 하나로 합쳐짐 |
YAML 1.2의 타입 판정
트리 탭과 수치는 YAML 1.2 코어 스키마로 파일을 읽습니다. 불리언은 true와 false(대소문자 세 가지 표기)뿐이고, null은 null, ~, 빈 값입니다. YAML 1.1 파서가 불리언으로 읽던 yes, no, on, off는 여기서 그냥 문자열이며, 오래된 로더에서 국가 코드 NO가 false가 되는 노르웨이 문제가 바로 이 차이에서 나옵니다.
0755처럼 0으로 시작하는 숫자는 YAML 1.2에서 8진수가 0o755로 따로 정해져 있으므로 10진수 755입니다. 2026-01-01 같은 날짜는 문자열, 0x1F는 31, 1e3은 1000입니다. 명시적 코어 태그도 적용합니다. !!float 1은 1.0, !!int '7'은 7, !!str 1은 문자열로 남고, %YAML 1.1에서는 !!bool yes가 true가 됩니다. 1과 "1"처럼 서로 다른 YAML 키가 같은 트리 키로 합쳐지면 뒤의 값이 남고 충돌 알림이 표시됩니다.
오류와 수치가 뜻하는 것
파서는 처음 발견한 문제를 줄과 열로 알려 줍니다. 자주 나오는 것은 탭 들여쓰기, 같은 단계 키의 들여쓰기 불일치, 한 매핑 안의 중복 키, 아직 정의되지 않은 앵커를 가리키는 별칭, 닫히지 않은 [ 또는 {입니다. 400단계보다 깊은 문서는 거부합니다. 별칭 펼침은 10만 개와 UTF-8 입력 바이트 수의 2배 중 큰 값을 노드 한도로 삼아, 억 개의 웃음 공격 문서를 이유와 함께 중단합니다.
키, 객체, 배열, 깊이는 펼친 데이터 기준으로 셉니다. <<로 키 다섯 개를 물려받은 매핑은 그 다섯 개도 키로 집계됩니다. 문서 수는 --- 구간의 개수이고, 파일 끝의 ---나 ...는 종료 표시이므로 빈 문서로 세지 않습니다. 병합 키는 발견한 << 항목의 개수입니다.
실제 예시
# service config
name: api # the name
base: &base
region: eu
retries: 3
prod:
<<: *base
region: "us"
tags: [a,b, c]# service config
name: api # the name
base: &base
region: eu
retries: 3
prod:
<<: *base
region: "us"
tags: [a, b, c]공백 2칸으로 정리한 결과입니다. 수치는 139바이트, 문서 1개, 키 8개, 객체 3개, 배열 1개, 깊이 2, 병합 키 1개입니다. 트리에서는 병합 키가 펼쳐져 prod가 region us, retries 3으로 보입니다.
a:
b:
- 1
- c: 2
d: [1, 2]a:
b:
- 1
- c: 2
d: [1, 2]들여쓰기를 4칸으로 바꾸면 같은 문서가 다시 출력됩니다. 결과를 한 번 더 정리해도 달라지지 않습니다.
hex: 0x1F
exp: 1e3
plus: +5
pad: 007
keep: 1.50
big: 12345678901234567890
inf: .INFhex: 0x1F
exp: 1e3
plus: +5
pad: 007
keep: 1.50
big: 12345678901234567890
inf: .INF정리되는 것은 배치뿐입니다. 16진수, 지수, 부호, 앞의 0, 끝의 0, 아주 큰 정수, .INF가 쓴 그대로 출력되므로 정리한 파일을 다른 로더가 읽는 방식도 달라지지 않습니다.
a: 1
---
b: 2
---a: 1
---
b: 2문서 두 개가 인식되어 둘 다 정리됩니다. 마지막 ---는 종료 표시라서 세 번째 빈 문서로 세지 않고 출력에서도 빠집니다.
name: Ada
langs:
- en
- fr
active: true5행 1열의 들여쓰기가 일정하지 않습니다. 같은 단계의 항목은 같은 열에서 시작해야 합니다.메시지는 편집기 아래에 나오고 5행이 강조되며 오류로 이동을 누르면 커서가 그 줄로 갑니다. 문법 오류 예제가 이 경우입니다.
a: *missing1행 4열의 별칭이 존재하지 않는 앵커를 가리킵니다(앵커는 사용하기 전에 정의해야 합니다).파일 앞쪽에 &missing을 정의하거나 별칭을 값으로 바꾸세요.
자주 하는 실수
공백 대신 탭
줄 맨 앞의 탭 하나만으로도 치명적인 오류가 나며, 메시지에 탭을 들여쓰기로 썼다는 말과 줄 번호가 나옵니다. 편집기가 YAML 파일에서는 공백을 입력하도록 설정하세요.
중복 키는 거부됨
한 매핑에
a:키가 두 번 있으면 일부 로더는 조용히 마지막 값을 쓰지만 이 포매터는 중복 키 오류로 멈춥니다. 어느 값을 의도했는지 정해 나머지를 지우세요.앞의 0은 남지만 읽는 방식이 다름
포매터는
0755를 그대로 두지만, YAML 1.2 로더는 이를 10진수 755로, YAML 1.1 로더는 8진수 493으로 읽습니다. 파일 권한이나 우편번호는"0755","01234"처럼 따옴표로 감싸 모든 로더가 같게 읽도록 하세요.YAML 버전에 따라 달라지는 불리언
yes,no,on,off는 여기서도, 모든 YAML 1.2 로더에서도 문자열입니다. 많은 YAML 1.1 로더는 불리언으로 읽습니다. 국가 코드라면"NO"처럼 따옴표를 쓰고, 불리언이 의도라면true나false로 쓰세요.별칭보다 뒤에 정의된 앵커
별칭은 파일에서 앞쪽에 나온 앵커만 가리킬 수 있습니다. 블록을 옮기다가 순서가 뒤집히면 깨질 수 있고, 이때 별칭 위치가 오류로 표시됩니다.
앵커 뒤 주석은 자리가 옮겨질 수 있음
base: &base # shared같은 줄에서는 주석이 앵커 위의 별도 줄로 출력됩니다. 같은 노드에 붙은 유효한 YAML이지만 모양은 원본과 다릅니다.
자주 묻는 질문
YAML 포매터가 주석을 유지하나요?
네. 문서를 데이터로 다시 만들지 않고 그대로 다시 출력하므로 주석, 앵커, 별칭, 병합 키, 따옴표 모양, --- 구분선이 유지됩니다. 빈 줄은 하나로 합쳐지고 키 순서는 바뀌지 않습니다.
설정 파일이 업로드되나요?
아니요. 텍스트는 브라우저 탭 안에서 읽고 출력하며 서버로 보내지 않습니다. 내부 호스트명이나 토큰이 들어 있을 수 있는 파일에서는 중요한 점입니다.
어떤 YAML 버전을 쓰나요?
자바스크립트 yaml 라이브러리의 YAML 1.2 코어 스키마이고 병합 키(<<)도 이해합니다. 그래서 yes, no는 문자열이고 0o17은 8진수 숫자입니다.
트리에 제가 쓴 것보다 키가 더 많은 이유가 뭔가요?
트리와 수치는 병합 키와 별칭을 펼친 뒤의 데이터를 보여 줍니다. <<: *base로 물려받은 키는 트리에 나타나지만, 정렬됨 탭에는 원래의 << 줄이 그대로 있습니다.
여러 문서가 든 파일도 정리되나요?
네. ---로 나뉜 모든 문서가 정리되고 집계됩니다. 트리에서는 여러 문서가 문서마다 항목 하나인 배열로 보입니다.
문법 오류가 난 줄은 어떻게 찾나요?
메시지에 줄과 열이 나오고 편집기에서 그 줄이 강조되며, 오류로 이동 버튼이 커서를 그 자리에 놓습니다. 줄을 고치면 버튼을 누르지 않아도 결과가 갱신됩니다.
크기 제한은 어떻게 되나요?
입력은 20MiB, 중첩은 400단계까지입니다. 별칭 펼침은 10만 개와 UTF-8 입력 바이트 수의 2배 중 큰 값을 노드 한도로 삼습니다. 큰 입력은 워커에서 처리하고, 5MiB를 넘으면 유효성 검사와 수치 계산만 하고 다시 출력하지 않아 페이지가 계속 반응합니다.
값의 경로는 어떻게 복사하나요?
트리 탭에서 키를 누르면 그 JSONPath가 클립보드에 복사되고 짧은 확인 메시지가 나옵니다.
더 깊이 읽기
- 8분 읽기YAML 문법 주의점: Norway 문제, yes/no 불리언, 8진수, 탭과 들여쓰기 오류YAML은 평범한 텍스트처럼 보여서 오히려 사고가 납니다. 같은 글자를 다르게 읽는 두 버전과, 줄에 따라 조용히 또는 시끄럽게 실패하는 들여쓰기 규칙이 대부분의 함정입니다.
- 7분 읽기Docker Compose 포트 매핑 완전 정리: 문법, 충돌 조건, "port is already allocated" 해결Compose의 포트 매핑은 호스트의 소켓 하나를 점유하겠다는 선언입니다. 어떤 선언끼리 겹치는지 정확히 알면 docker compose up이 왜 실패하는지, 어느 줄을 고쳐야 하는지가 보입니다.
마지막 업데이트:
