ToolActToolAct

YAML 포맷 도구

YAML 입력
출력 결과
줄 수: 1문자 수: 0바이트 수: 0
줄 수: 1문자 수: 0

YAML이란?

YAML(YAML Ain't Markup Language)은 설정 파일과 데이터 교환을 위해 설계된 사람이 읽을 수 있는 데이터 직렬화 언어입니다. XML보다 읽기 쉽고, JSON보다 표현력이 풍부한 간결하고 명확한 구문으로 유명합니다. YAML은 들여쓰기로 계층 관계를 표시하고, 콜론으로 키-값 쌍을 구분하며, 대시로 목록 항목을 표시하여 설정 파일 작성에 적합합니다.

사용 방법

사용 방법

  1. 왼쪽 입력 상자에 YAML 데이터를 붙여넣거나 입력하세요
  2. 프로젝트 스타일에 맞는 들여쓰기 크기를 선택하세요
  3. '포맷'으로 정리하고, '축소'로 크기를 줄이거나, '검증'으로 구문을 확인하세요
  4. 오른쪽에서 결과를 확인하세요
  5. '복사'를 클릭하여 클립보드에 복사하세요

옵션 설명

들여쓰기 크기2칸 또는 4칸 들여쓰기를 선택하세요

키보드 단축키

  • Ctrl + Enter포맷
  • Ctrl + Shift + C결과 복사

YAML 팁

  • YAML은 들여쓰기에 민감하므로, 포맷 후 CI, Kubernetes, 배포 파일에 사용하기 전에 중첩된 리스트와 맵을 검토하세요.
  • 가능하면 대상 도구의 스키마로 검증하세요. 구문이 올바른 YAML도 GitHub Actions, Docker Compose, OpenAPI에는 맞지 않을 수 있습니다.

활용 사례

커밋 전 간단한 YAML 설정 정규화애플리케이션, 서버, 데이터베이스, 기능 플래그, 로깅, 사용자 역할 등의 YAML을 붙여넣고 2칸 또는 4칸 들여쓰기로 포맷하세요. 이 도구는 일상적인 키-값, 중첩 객체, 배열, 불리언, 숫자, null, 따옴표 문자열 구조를 대상으로 합니다.
흔한 YAML 공백 실수 빠르게 발견내장 검증기가 콜론 구분자가 없는 줄, 콜론 뒤에 필수 공백이 빠진 값, 공백 대신 탭이 사용된 부분을 표시합니다. 이를 통해 파일이 CI 파서, 배포 스크립트, 문서 페이지에 도달하기 전에 복사-붙여넣기와 수동 편집 실수를 상당수 잡을 수 있습니다. 파싱과 검증이 모두 브라우저에서 이루어지므로, 내부 서비스 이름이나 미출시 이미지 태그, 스테이징 자격 증명이 포함된 초안 매니페스트를 원격 검증기에 업로드하지 않고 정리할 수 있습니다.
지저분한 초안에서 깔끔한 YAML 샘플 생성파싱 후 포맷터가 객체 트리를 일관된 YAML로 다시 작성하고, 포맷된 formatted.yaml을 복사하거나 다운로드할 수 있습니다. 전체 YAML 엔진이 아닌 경량 파서를 사용하므로, 앵커, 복잡한 여러 줄 스칼라, 태그, 고급 스키마 동작은 파일을 소비할 런타임에서 별도로 확인해야 합니다.
다운스트림 파이프라인을 위해 YAML을 JSON으로 변환토글을 사용하면 동일한 들여쓰기 옵션을 유지한 채 출력을 JSON으로 전환할 수 있어, CI 스크립트, jq 필터, 정책 검사가 별도의 파서 없이 파일을 소비할 수 있습니다. 혼합 타입 배열과 따옴표 문자열은 그대로 유지되지만, YAML 앵커와 별칭은 경량 파서에 의해 평탄화됩니다.
Kubernetes 또는 Docker Compose 매니페스트 사전 점검deployment.yaml이나 docker-compose.yml을 넣고, 검증기가 표시하는 공백 오류를 수정한 뒤, apiVersion, kind, spec 블록이 올바르게 정렬되었는지 확인하세요. 이 페이지는 빠른 읽기-정리 단계이며, 최종 매니페스트는 스키마 이슈를 잡기 위해 kubectl apply --dry-run=client 또는 docker compose config를 실행해야 합니다.

기술 원리

YAML 포맷팅은 YAML 1.2.2 사양(2021년 10월 개정)을 기반으로 합니다. 이 사양은 JSON을 YAML의 엄격한 부분 집합으로 공식 정의합니다. 즉, 유효한 JSON 문서는 모두 YAML로 파싱할 수 있습니다. 파싱은 세 단계로 진행됩니다. 프레젠테이션 계층이 유니코드 코드 포인트를 스캔하고 문자 이스케이프를 해석하고, 직렬화 계층이 스칼라·시퀀스·매핑의 노드 그래프를 구성하며, 네이티브 계층이 YAML Core Schema를 적용하여 스칼라를 `!!str`, `!!int`, `!!float`, `!!bool`, `!!null`, `!!seq`, `!!map` 타입으로 변환합니다. 주요 라이브러리로는 Node.js의 js-yaml과 최신 `yaml` 패키지, Python의 PyYAML과 ruamel.yaml, JVM의 SnakeYAML이 있습니다. 브라우저 기반 포맷터는 보통 js-yaml의 `load`/`dump`를 통해 일반 JS 객체로 파싱한 후 변환합니다. 들여쓰기는 핵심 요소입니다. ASCII 공백(U+0020)만 허용되며, 사양 §6.1에서 탭 문자(U+0009)의 들여쓰기 사용을 명시적으로 금지합니다. 따라서 코드 편집기에서 자동 변환된 탭을 붙여넣는 것이 가장 흔한 파싱 실패 원인입니다. 블록 스타일은 컬럼 위치만으로 중첩을 결정하므로, 자식 노드는 부모보다 최소 한 칸 이상(관례적으로 두 칸) 더 들여쓰기해야 합니다. 플로우 스타일은 JSON 구문을 차용하여 `[1, 2, 3]`과 `{a: 1, b: 2}` 형태로 쓸 수 있으며, 블록 스타일 안에 중첩하여 한 줄 표현이 가능합니다. 블록 스칼라는 표시자 기반 접기를 사용합니다: `|`(리터럴)은 줄바꿈을 그대로 보존하고, `>`(폴디드)는 단일 줄바꿈을 공백으로 변환하며 빈 줄은 단락 구분자로 유지합니다. 접미 표시자 `-`(뒤쪽 줄바꿈 제거)와 `+`(뒤쪽 줄바꿈 모두 유지)는 표시자 뒤에 붙습니다(`|-`, `>+`). 인용 규칙도 다릅니다: 작은따옴표 스칼라는 `\`를 문자 그대로 처리하고 `''`로 따옴표를 삽입하며, 큰따옴표 스칼라는 C 스타일 이스케이프(`\n`, `\t`, `\uXXXX`)를 지원합니다. 포맷터는 보통 하나의 블록 스타일로 정규화하고 앵커와 별칭을 다시 내보냅니다. 앵커 `&name`은 노드를 표시하고, 별칭 `*name`은 이를 참조하며, 병합 키 `<<: *name`(YAML 1.1 유산으로 대부분의 파서에서 여전히 지원)은 다른 매핑에서 키를 가져옵니다. 다중 문서 스트림은 `---` 시작 마커와 선택적 `...` 종료 마커로 구분되며, 이 방식은 Kubernetes가 하나의 매니페스트에 여러 리소스를 전달하는 데 사용합니다. 두 가지 주의할 점을 안전하게 다시 내보내야 합니다: 노르웨이 문제 - 따옴표 없는 스칼라 `no`가 YAML 1.1 스키마에서 `false`로 해석되는 문제(국가 코드가 불리언이 됨) - 와 CVE-2017-18342(PyYAML의 `yaml.load`가 임의 Python 객체를 역직렬화하는 취약점, `safe_load`로 전환하여 수정). 이 두 가지 모두 포맷터가 스칼라 해석을 신중하게 처리하고 태그 생성자를 절대 실행해서는 안 되는 이유입니다. 파싱은 입력 길이에 대해 O(n)이며, 주석은 YAML 정보 모델의 일부가 아니므로 대부분의 AST 기반 라이브러리에서 버려집니다.

  • 사양: YAML 1.2.2 (2021년 10월). JSON은 YAML 1.2의 엄격한 부분 집합이므로 유효한 JSON 문서는 모두 YAML로 파싱됩니다. 주요 라이브러리: js-yaml, `yaml` 패키지, PyYAML, ruamel.yaml, SnakeYAML.
  • 들여쓰기는 ASCII 공백(U+0020)이어야 하며, §6.1에서 탭 문자(U+0009)의 들여쓰기 사용을 금지합니다. 이것이 `mapping values are not allowed here` 오류의 가장 흔한 원인입니다.
  • 블록 스타일 vs 플로우 스타일: 블록은 컬럼 위치 기반 중첩(관례적으로 2 또는 4칸), 플로우는 JSON 유사 구문 `[1, 2, 3]`과 `{a: 1}`. 둘 다 중첩 가능.
  • 블록 스칼라: `|` 리터럴은 줄바꿈을 보존, `>` 폴디드는 단일 줄바꿈을 공백으로 변환. 접미 표시자 `-`(제거)와 `+`(유지)는 표시자 뒤에 붙음, 예: `|-`, `>+`.
  • 앵커 `&name`은 노드를 표시하고, 별칭 `*name`은 이를 참조하며, 병합 키 `<<: *name`은 다른 매핑에서 키를 가져옴 (YAML 1.1 유산, 대부분의 파서에서 지원).
  • 다중 문서 스트림은 `---`(시작)와 선택적 `...`(종료) 마커로 구분 - Kubernetes가 하나의 매니페스트에 여러 리소스를 전달하는 방식.
  • 주의 사항: 노르웨이 문제 (따옴표 없는 `no`/`yes`/`on`/`off`가 YAML 1.1 스키마에서 불리언으로 파싱됨; YAML 1.2 Core Schema는 대부분 수정) 및 CVE-2017-18342 (PyYAML `yaml.load` 임의 코드 실행; `safe_load` 사용 권장).

예시

설정 파일의 일관되지 않은 들여쓰기 수정

입력 (잘못됨):
server:
   port: 8080
     host: localhost
  debug: true

포맷 후 (2칸):
server:
  port: 8080
  host: localhost
  debug: true

docker-compose.yml의 중첩된 서비스 목록

version: '3.8'
services:
  web:
    image: nginx:1.25
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - api
  api:
    image: node:20
    environment:
      NODE_ENV: production

Kubernetes Deployment 매니페스트

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    spec:
      containers:
        - name: web
          image: nginx:1.25

jq 파이프라인을 위해 YAML을 JSON으로 변환

YAML 입력:
user:
  id: 42
  name: alice
  roles:
    - admin
    - editor

JSON 출력:
{
  "user": {
    "id": 42,
    "name": "alice",
    "roles": ["admin", "editor"]
  }
}

콜론 뒤 공백 누락 잡아내기

입력:
name:alice
age: 30

오류 (1행): 콜론 뒤 공백 누락
수정:
name: alice
age: 30

자주 묻는 질문

YAML 포맷팅은 무엇을 정리해 주나요?

들여쓰기 정규화(보통 공백 2칸), 따옴표 스타일 통일, 리스트 마커 정렬, 그리고 길게 늘어진 인라인 컬렉션을 블록 스타일로 다시 펼치는 작업을 합니다. 실무에서 보는 YAML은 대부분 손으로 편집한 탓에 스타일이 들쭉날쭉한데, 포맷터가 이를 균일하게 정리해 줍니다.

플로우 스타일을 블록 스타일로 바꿔주나요?

많은 빌드가 플로우 스타일(JSON과 비슷한 {key: value, key2: value2})과 블록 스타일(여러 줄 들여쓰기) 중 선택할 수 있게 해 줍니다. 사람이 편집하기에는 블록이, 공간 절약에는 플로우가 좋습니다. 두 형식 간 변환은 데이터를 보존하지만 외관은 달라집니다.

왜 따옴표가 바뀌나요?

YAML은 따옴표 없는 문자열, 작은따옴표 문자열, 큰따옴표 문자열을 미묘하게 다르게 다룹니다. yes/no, true/false, on/off는 따옴표가 없으면 불리언으로 해석되고, 따옴표 없는 숫자는 숫자, 따옴표가 붙으면 문자열로 처리됩니다. 포맷터는 이런 잘못된 해석을 막기 위해 필요한 곳에 따옴표를 추가하기도 합니다.

주석은 보존되나요?

대부분의 빌드는 YAML 주석(#)을 보존하지만 AST 노드 기준 위치는 약간 옮겨질 수 있습니다. 키 위에 있던 주석은 보통 위에 그대로 남고, 같은 줄 끝의 주석도 따라붙습니다. 포맷팅 후에는 주석 위치가 의미상 여전히 맞는지 확인하세요.

YAML이 업로드되나요?

아니요. 파싱과 포맷팅은 js-yaml 같은 라이브러리를 사용해 브라우저에서 처리됩니다. 붙여넣은 YAML은 외부로 전송되지 않습니다.

라운드트립 시 앵커와 별칭이 바뀌는 이유는 무엇인가요?

YAML의 &(앵커)와 *(별칭) 문법은 값을 한 번 정의해 여러 곳에서 재사용하게 해 줍니다. 일부 포맷터는 기본적으로 별칭을 인라인으로 펼쳐 중복 제거 효과를 잃게 만듭니다. 도구 동작이 앵커에 의존한다면 앵커를 보존하는 옵션이 있는지 확인하세요.

YAML이 탭 들여쓰기를 사용한다면요?

YAML은 들여쓰기에 탭을 허용하지 않으며 반드시 공백을 써야 합니다. 포맷터는 보통 탭을 공백으로 변환하거나 설정에 따라 파싱을 거부합니다. 파싱 오류가 난다면 붙여넣기 전에 탭을 공백으로 바꿔주세요.