JSON ↔ YAML 변환이란 무엇인가요?
JSON(JavaScript Object Notation, RFC 8259)은 중괄호로 경계를 짓는 엄격한 구조화 데이터 텍스트 형식이고, YAML(YAML Ain't Markup Language, 1.2 버전)은 JSON의 상위 집합으로 인덴트, 줄바꿈, 사람이 읽기 쉬운 문법을 사용해 동일한 값 모델을 표현합니다. 둘 사이를 변환하면 한 키도 다시 입력하지 않고 같은 설정을 기계 친화적인 형태(JSON: API, 스키마 검증, 프로그램적 변환)와 사람 친화적인 형태(YAML: 코드 리뷰, Kubernetes 매니페스트, GitHub Actions 워크플로) 사이에서 전환할 수 있습니다.
JSON ↔ YAML 변환은 어떻게 작동하나요?
모든 변환은 브라우저에서 동봉된 js-yaml 라이브러리(MIT, 4.1.0 버전)로 로컬에서 실행됩니다. 큰 흐름은 다음과 같습니다:
- 모드 선택기(자동 감지 / JSON → YAML / YAML → JSON)가 어느 파이프라인을 실행할지 결정합니다. 자동 감지 모드에서는 입력의 첫 번째 공백이 아닌 문자가 방향을 정합니다 —
{또는[이면 JSON, 그 외에는 YAML로 봅니다. - JSON → YAML:
JSON.parse가 입력을 검증하여 JavaScript 값을 만들고,jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false })가 YAML 1.2 형태로 기록합니다. 다중 문서가 켜져 있으면 입력 배열은 요소마다 하나의 문서로 출력되며---구분자로 연결됩니다. - YAML → JSON:
jsyaml.loadAll이 입력의 모든 문서를 파싱(---구분자도 자동 처리)하여 배열로 만듭니다. 단일 문서 입력은 언래핑되어 JSON 출력이 단일 요소 배열이 아니라 그 문서 자체가 됩니다. - 인덴트(공백 2칸 또는 4칸)와 보기 좋게 인쇄는 설정할 수 있습니다. 보기 좋게 인쇄를 끄면
JSON.stringify(value)로 공백이 없는 최소화 JSON이 출력됩니다. - 결과는 읽기 전용 텍스트 영역에 기록됩니다. YAML 파싱이 실패하면 에러 메시지에
js-yaml이e.mark에 보고하는 1 기반 행·열 번호가 포함되어 해당 위치로 바로 이동할 수 있습니다.
이 도구로 JSON과 YAML을 변환해야 하는 이유는?
- 프라이버시: 모든 파싱, 변환, 출력이 브라우저에서 일어납니다. Kubernetes 시크릿, 서명된 JWT, 사내 설정을 포함한 데이터는 절대 서버에 도달하지 않습니다.
- 다중 문서 YAML:
jsyaml.loadAll이---구분자를 인식해 문서 배열을 반환하고, 변환기는 단일 문서 케이스에서는 언래핑하고 다중 문서 케이스에서는 JSON 배열로 보존합니다. - 앵커와 별칭 해석: YAML의
&anchor/*alias메커니즘은js-yaml기본 스키마가 처리합니다. 한 번 정의되어 두 번 참조된 값은 모든 참조가 동일한 값을 갖는 JSON 객체로 왕복됩니다. - CDN 없음, 텔레메트리 없음:
js-yaml.min.js라이브러리가 페이지와 동일 오리진에서 제공되므로 오프라인, 사내 프록시, 망분리 환경에서도 동작합니다.
JSON ↔ YAML 변환의 일반적인 활용 사례는 무엇인가요?
DevOps, 플랫폼 엔지니어링, API 도구 곳곳에서 JSON과 YAML 변환이 등장합니다:
- Kubernetes 매니페스트: YAML 형태의
Deployment,ConfigMap또는HelmRelease를 JSON으로 변환해 사내 정책 검증기(Joi, Ajv, OPA Rego)가 프로그램적으로 lint하게 한 뒤, 다시 YAML로 되돌려 클러스터에 적용합니다. - CI/CD 워크플로: GitHub Actions의
workflow.yml을 JSON을 거쳐 왕복시켜 코드 생성기가 매트릭스나 잡 의존성을 다시 쓰게 하고, 정돈된 YAML을 PR에 푸시합니다. - OpenAPI 스펙: 백엔드가 자동 생성한 문서에서 내보낸 JSON
openapi.json을openapi.yaml로 바꿔, 사람이 편집하는 레퍼런스로 저장소에 체크인합니다.
JSON ↔ YAML 왕복 변환 예시는 어떻게 생겼나요?
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}}를 붙여넣고 JSON → YAML 모드에서 변환을 누르면, 첫 줄이 apiVersion: apps/v1로 시작하는 8줄짜리 인덴트된 YAML이 나옵니다. 그 YAML을 YAML → JSON 모드에서 보기 좋게 인쇄를 켜고 다시 입력하면 JSON.stringify(value, null, 2) 이후 원본 객체가 바이트 단위로 복원되고, 키 순서도 보존됩니다 — js-yaml의 기본 스키마가 양방향 모두에서 삽입 순서를 지키기 때문입니다.
이 JSON ↔ YAML 변환기는 전적으로 브라우저에서 실행되나요?
네. 모든 파싱, 변환, 출력이 브라우저 탭 안의 JavaScript로 로컬에서 실행됩니다. 동봉된 js-yaml 라이브러리는 페이지와 동일 오리진에서 제공되며 — CDN 없음, fetch 없음, XMLHttpRequest 없음, 입력에 대해 navigator.sendBeacon도 호출하지 않습니다. 페이지를 한 번 로드하면 오프라인에서도 동작합니다. 런타임 API 의존성이 없고 외부 라이브러리도 함께 동봉된 정적 HTML/CSS/JS 번들이기 때문입니다. Kubernetes 시크릿, JWT 페이로드, 서명된 CloudFormation YAML, 사내 설정은 모두 사용자의 기기에 머무릅니다.
변환기는 다중 문서 YAML을 어떻게 처리하나요?
YAML은 ---만 있는 줄로 구분해 한 스트림에 여러 문서를 담을 수 있습니다. YAML → JSON 방향에서 변환기는 jsyaml.loadAll을 호출해 모든 문서를 JavaScript 값으로 반환합니다. 문서가 정확히 하나면 JSON 출력은 그 문서 자체가 되고, 두 개 이상이면 JSON 출력은 배열이 됩니다. JSON → YAML 방향에서는 입력이 JSON 배열이고 다중 문서 토글이 켜져 있을 때 각 배열 요소가 자신만의 문서로 출력되며, 그 사이에 --- 구분자가 들어갑니다 — JSON 리소스 배열로부터 kubectl apply에 적합한 번들을 만드는 데 유용합니다.
YAML 앵커와 별칭이 지원되나요?
네 — &anchor 정의와 *alias 참조는 로드 단계에서 js-yaml 기본 스키마가 해석합니다. defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d와 같은 YAML 입력은 job_a와 job_b 둘 다 retries: 3, timeout: 30을 포함하는 JSON 객체로 파싱됩니다. 병합 키 <<(YAML 1.1 확장이지만 js-yaml이 여전히 지원)도 기본 스키마에서 지원됩니다.
JSON과 YAML 사이를 오갈 때 YAML 주석은 보존되나요?
아니요 — js-yaml은 파싱 단계에서 주석을 제거하므로 YAML → JSON → YAML 왕복은 #으로 시작하는 모든 줄을 잃습니다. 이는 load/dump 모델의 알려진 제한입니다. 주석 보존이 중요하다면 js-yaml 대신 주석 인식 라이브러리(예: trivia 보존을 위해 설계된 CST + AST API를 제공하는 yaml npm 패키지)를 사용하세요. 대부분의 설정 변환 워크플로에서는 이 트레이드오프가 받아들일 만합니다: 왕복한 YAML은 모든 키, 값, 앵커, 별칭을 그대로 유지하고 사람이 쓴 주석만 잃습니다.
사용자 정의 YAML 태그는 어떻게 되나요?
변환기는 js-yaml의 DEFAULT_SCHEMA를 사용하며 !!str, !!int, !!float, !!bool, !!null, !!seq, !!map, !!binary, !!timestamp를 이해합니다 — 즉 YAML 1.2 core와 JSON 스키마의 모든 태그입니다. 사용자 정의나 애플리케이션 고유 태그(CloudFormation의 !Ref, Ansible의 !vault 등)는 인식되지 않으며, 지원되지 않는 태그를 명시한 명확한 에러가 발생합니다. CloudFormation의 경우 aws cloudformation package + --output-template-file 흐름으로 사용자 정의 태그를 먼저 전개한 뒤 본 변환기에 붙여넣으세요.
이 JSON ↔ YAML 변환기는 js-yaml@4.1.0을 페이지와 동일 오리진에 동봉하고, 다중 문서 스트림과 앵커/별칭을 기본 지원하며, YAML 파싱 에러를 행·열 번호와 함께 보고해 소스를 바로 수정할 수 있게 합니다. 업로드 없음, CDN 없음, 텔레메트리 없음 — 모든 바이트가 브라우저 안에 머무릅니다.