JSON vs YAML 완벽 비교: 어떤 형식을 선택해야 할까?
개발자라면 JSON과 YAML을 매일 접하게 됩니다. Docker Compose는 YAML을, API 응답은 JSON을 사용합니다. 두 형식은 각각 어떤 장단점이 있고, 언제 어떤 것을 선택해야 할까요? 이 글에서 상세히 비교합니다.
기본 문법 비교
같은 데이터를 JSON과 YAML로 표현해보겠습니다.
JSON
{"server": {"host": "localhost","port": 8080,"debug": true,"databases": ["postgres", "redis"],"cors": {"origins": ["https://example.com"],"credentials": true}}}
YAML
server:host: localhostport: 8080debug: truedatabases:- postgres- rediscors:origins:- https://example.comcredentials: true
핵심 차이점
| 특성 | JSON | YAML |
|---|---|---|
| 가독성 | 괜찮음 | 매우 좋음 |
| 주석 지원 | 불가 |
|
| 파일 크기 | 더 큼 (괄호, 따옴표) | 더 작음 |
| 파싱 속도 | 빠름 | 상대적으로 느림 |
| 데이터 타입 | 6가지 | 더 다양 (날짜, 바이너리 등) |
| 들여쓰기 | 의미 없음 | 구조를 결정함 |
| 표준화 | RFC 8259 | YAML 1.2 |
JSON의 장점
1. 범용성과 호환성
거의 모든 프로그래밍 언어에 JSON 파서가 내장되어 있습니다. 브라우저의 JSON.parse()와 JSON.stringify()는 추가 라이브러리 없이 바로 사용할 수 있습니다.
2. 파싱 성능
JSON은 문법이 단순하여 파싱 속도가 빠릅니다. 대용량 데이터를 처리할 때 유리합니다.
3. 엄격한 문법
문법이 엄격하여 파싱 오류를 쉽게 발견할 수 있습니다. 모호한 해석의 여지가 없습니다.
4. API 표준
REST API, GraphQL 등 대부분의 웹 API가 JSON을 기본 형식으로 사용합니다.
YAML의 장점
1. 가독성
들여쓰기 기반 구조로 사람이 읽기 매우 편합니다. 설정 파일에 특히 적합합니다.
2. 주석 지원
# 기호로 주석을 작성할 수 있어 설정 파일에 설명을 추가할 수 있습니다.
# 데이터베이스 설정database:host: localhost # 개발 환경용port: 5432
3. 멀티라인 문자열
긴 텍스트를 깔끔하게 작성할 수 있습니다.
description: |이것은 여러 줄에 걸친긴 설명 텍스트입니다.줄바꿈이 유지됩니다.
4. 앵커와 별칭
반복되는 값을 참조로 재사용할 수 있습니다.
defaults: &defaultstimeout: 30retries: 3development:<<: *defaultsdebug: trueproduction:<<: *defaultsdebug: false
언제 어떤 형식을 선택할까?
JSON을 선택해야 하는 경우
- API 통신: 클라이언트-서버 간 데이터 교환
- 브라우저 환경: 웹 프론트엔드에서 데이터 처리
- 프로그래밍 데이터: 코드에서 직접 생성/소비하는 데이터
- 성능이 중요한 경우: 대용량 데이터의 빠른 파싱
YAML을 선택해야 하는 경우
- 설정 파일: Docker Compose, Kubernetes, GitHub Actions
- 사람이 편집하는 파일: 주석과 가독성이 중요할 때
- CI/CD 파이프라인: 워크플로우 정의
- 문서화가 필요한 설정: 각 옵션에 설명이 필요할 때
YAML 사용 시 주의사항
들여쓰기 실수
YAML에서 가장 흔한 오류입니다. 탭 대신 반드시 스페이스를 사용하세요.
암묵적 타입 변환
YAML은 yes, no, on, off를 불리언으로 자동 변환합니다. 문자열로 사용하려면 따옴표가 필요합니다.
# 주의: country가 boolean true로 해석됨country: NO# 올바른 방법country: "NO"
보안 이슈
YAML의 일부 구현체는 임의 코드 실행 취약점이 있을 수 있습니다. 신뢰할 수 없는 YAML 입력을 처리할 때는 안전한 로더를 사용하세요.
마무리
JSON과 YAML은 경쟁이 아닌 보완 관계입니다. 상황에 맞게 적절히 선택하고, 필요할 때 JSONKit의 Convert 도구를 사용하면 두 형식 간 변환을 즉시 수행할 수 있습니다.