cv.cm

지식 · 텍스트, 데이터, 보안

JSON vs YAML vs XML: 어떤 포맷을 써야 할까요?

6분 분량

핵심 답변

JSON, YAML, XML은 구조화된 데이터를 위한 텍스트 포맷입니다. JSON은 간결하고 엄격하며 값 타입이 여섯 가지이고, 웹 API에서 압도적으로 많이 쓰입니다. YAML은 들여쓰기 기반으로 주석을 허용해 설정 파일에 많이 쓰입니다. XML은 태그와 속성을 쓰고 네임스페이스와 정식 스키마를 지원하며, 문서, 기업용 시스템, 피드에서 여전히 흔합니다. 세 포맷 모두 같은 중첩 데이터를 표현할 수 있습니다.

JSON 포맷 열기

같은 데이터를 세 포맷으로

이름, 활성 여부, 역할 두 개를 가진 사용자는 각 포맷에서 다음과 같습니다.

포맷예시
JSON{"name": "Ana", "active": true, "roles": ["admin", "editor"]}
YAMLname: Ana / active: true / roles: [admin, editor] (한 줄에 키 하나)
XML<user active="true"><name>Ana</name><role>admin</role><role>editor</role></user>

JSON과 YAML은 대부분의 프로그래밍 언어에서 객체, 리스트, 스칼라 값에 그대로 대응됩니다. XML은 요소의 트리를 표현하며, 객체로의 대응은 관례일 뿐입니다. 이 예에서 활성 여부는 속성일 수도 자식 요소일 수도 있고, XML 자체에는 그 값이 텍스트 true가 아니라 불리언이라는 정보가 없습니다.

나란히 비교하기

JSONYAMLXML
명세RFC 8259, ECMA-404YAML 1.2.2 (2021)W3C XML 1.0, Fifth Edition
구조중괄호와 대괄호들여쓰기여는 태그와 닫는 태그
주석허용 안 함# comment<!-- comment -->
기본 타입객체, 배열, 문자열, 숫자, 불리언, null맵, 시퀀스, 타입으로 해석되는 스칼라스키마가 타입을 지정하지 않으면 텍스트뿐
스키마 언어JSON Schema대개 JSON SchemaXSD, DTD, RELAX NG
부가 기능없음앵커와 별칭, 파일 하나에 여러 문서속성, 네임스페이스, 혼합 콘텐츠
주요 용도웹 API, 브라우저 데이터, 로그설정: Kubernetes, CI 파이프라인, Docker ComposeOffice 파일, SVG, RSS, SOAP, Android 레이아웃

JSON: 엄격하고 예측 가능

JSON의 문법은 한 페이지에 들어갈 만큼 작아서 모든 언어의 파서가 같은 결과를 냅니다. 하지만 그 엄격함 때문에 가장 흔한 오류도 생깁니다.

  • 키와 문자열에는 큰따옴표가 필요하며, 작은따옴표는 유효하지 않습니다.
  • 객체나 배열의 마지막 항목 뒤에 쉼표를 붙이면 안 됩니다.
  • 주석이 없어서 JSON으로 쓴 설정은 스스로를 설명할 수 없습니다. JSONC나 JSON5 같은 변형은 주석을 추가하지만 표준 JSON은 아닙니다.
  • RFC 8259는 시스템 간에 주고받는 JSON에 UTF-8을 요구합니다.

문법상 숫자 크기에는 제한이 없지만, RFC 8259는 대부분의 소프트웨어가 IEEE 754 배정밀도 부동소수점을 쓴다고 언급합니다. JavaScript에서는 9007199254740992(2^53)보다 큰 정수가 정밀도를 잃으므로, 큰 ID는 문자열로 보내는 편이 안전합니다.

YAML: 읽기 쉽지만 함정이 있음

YAML은 사람이 읽고 편집하기 좋게 설계되었고, YAML 1.2는 JSON의 상위 집합에 가까워 대부분의 JSON 파일은 YAML로도 유효합니다. 하지만 유연함에는 대가가 따릅니다.

  • 들여쓰기가 곧 구조입니다. 공백 하나만 잘못 들어가도 중첩이 바뀌며, 들여쓰기에 탭은 쓸 수 없습니다.
  • 따옴표 없는 값은 타입을 추측합니다. 여전히 많은 파서가 쓰는 YAML 1.1 규칙에서는 no, off, yes가 불리언이 되어, 국가 코드 NO가 false로 바뀝니다. YAML 1.2의 core 스키마는 true와 false만 불리언으로 취급하지만, 사용하는 파서가 어떤 버전을 구현하는지 확인하세요.
  • 1.10 같은 값은 숫자 1.1이 되고 012는 8진수가 될 수 있습니다. 버전 번호나 우편번호처럼 숫자처럼 보이기만 하는 문자열은 따옴표로 감싸세요.

XML: 장황하지만 문서용으로 설계됨

단순한 데이터에는 XML이 JSON보다 무겁지만, 다른 두 포맷이 못하는 일을 해냅니다. <p>Hello <b>world</b></p>처럼 텍스트 안에 마크업이 섞인 혼합 콘텐츠, 출처가 다른 어휘를 한 파일에 공존시키는 네임스페이스, XSD를 통한 성숙한 검증이 그렇습니다. DOCX, XLSX, SVG, RSS 같은 포맷도 내부는 XML입니다.

XML을 JSON으로 변환하면 본질적으로 정보가 손실됩니다. 속성, 요소 순서, 반복 요소, 혼합 콘텐츠에는 하나로 정해진 JSON 표현이 없으므로, 변환기는 속성에 @ 접두사를 붙이거나 반복 요소를 배열로 강제하는 등의 관례를 택합니다.

자주 묻는 질문

YAML은 JSON의 상위 집합인가요?

YAML 1.2는 JSON의 거의 완전한 상위 집합이 되도록 개정되어, 거의 모든 JSON 문서가 YAML로 파싱됩니다. 몇 가지 예외가 있고, YAML 1.1 파서는 호환성이 더 떨어집니다.

JSON은 왜 주석을 허용하지 않나요?

JSON의 창시자는 주석이 상호 운용성을 깨는 파싱 지시문을 담는 데 쓰이지 않도록 일부러 뺐습니다. 설정에 주석이 필요한 도구는 JSONC, JSON5 또는 YAML을 씁니다.

JSON과 XML 중 어느 쪽이 파싱이 빠른가요?

같은 데이터라면 보통 JSON이 더 빠르고 작습니다. 문법이 더 단순하고 닫는 태그, 속성, 네임스페이스가 없기 때문입니다. 이 차이는 주로 대용량 처리에서 의미가 있습니다.

YAML을 JSON으로 변환해도 손실이 없나요?

데이터는 유지되지만 주석, 앵커, 키 서식은 JSON에 들어갈 자리가 없어 사라집니다. JSON을 YAML로 변환하는 것은 무손실입니다.

전체 지식 문서