JSON vs YAML: 어떤 포맷을 선택해야 할까? 완벽 비교
JSON과 YAML의 차이점, 장단점, 사용 사례를 비교하고 프로젝트에 맞는 포맷을 선택하는 방법을 배워보세요.
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# JSON vs YAML: 어떤 포맷을 선택해야 할까?
JSON과 YAML은 데이터 직렬화의 양대 산맥입니다. 각각의 장단점을 이해하고 프로젝트에 맞는 포맷을 선택하는 방법을 알아보세요.
개요
JSON (JavaScript Object Notation)
특징:- JavaScript 기반
- 중괄호와 대괄호 사용
- 엄격한 문법
- 널리 지원됨
{
"name": "홍길동",
"age": 30,
"hobbies": ["독서", "여행"]
}
YAML (YAML Ain't Markup Language)
특징:- 들여쓰기 기반
- 사람이 읽기 쉬움
- 유연한 문법
- 주석 지원
name: 홍길동
age: 30
hobbies:
- 독서
- 여행
문법 비교
객체/매핑
JSON:{
"user": {
"name": "홍길동",
"email": "hong@example.com"
}
}
YAML:
user:
name: 홍길동
email: hong@example.com
배열/리스트
JSON:{
"fruits": ["사과", "바나나", "오렌지"]
}
YAML:
fruits:
- 사과
- 바나나
- 오렌지
# 또는 인라인
fruits: [사과, 바나나, 오렌지]
문자열
JSON:{
"message": "안녕하세요",
"multiline": "첫 줄\n두번째 줄"
}
YAML:
message: 안녕하세요
# 여러 줄 (줄바꿈 유지)
multiline: |
첫 줄
두번째 줄
# 여러 줄 (줄바꿈을 공백으로)
folded: >
긴 텍스트가
여러 줄에
걸쳐 있습니다
숫자와 불리언
JSON:{
"count": 42,
"price": 99.99,
"active": true,
"disabled": false,
"empty": null
}
YAML:
count: 42
price: 99.99
active: true # 또는 yes, on
disabled: false # 또는 no, off
empty: null # 또는 ~
주석
JSON:{
"name": "홍길동"
}
주석 불가 ❌
YAML:# 이것은 주석입니다
name: 홍길동 # 인라인 주석도 가능
고급 기능 비교
앵커와 참조 (YAML)
YAML은 앵커(&)와 참조()로 중복 제거:
defaults: &defaults
timeout: 30
retries: 3
development:
<<: defaults
debug: true
production:
<<: *defaults
debug: false
JSON은 이 기능이 없음 ❌
데이터 타입
YAML:# 문자열 (따옴표 선택적)
string1: 안녕하세요
string2: '안녕하세요'
string3: "안녕하세요"
# 날짜
date: 2026-01-16
# 타임스탬프
timestamp: 2026-01-16T10:00:00Z
# 이진 데이터
binary: !!binary |
R0lGODlhDAAMAIQAAP//9/X
JSON:
- 문자열은 항상 쌍따옴표 ✅
- 날짜는 문자열로 ✅
- 이진 데이터는 Base64 문자열로 ✅
복잡한 키
YAML:? - 복잡한
- 키
: 값
JSON:
키는 항상 문자열만 ✅
장단점 비교
JSON 장점
JSON 단점
YAML 장점
YAML 단점
성능 비교
파싱 속도
벤치마크 (Python):import json
import yaml
import time
data = {"users": [{"name": f"User{i}", "id": i} for i in range(1000)]}
# JSON
start = time.time()
json_str = json.dumps(data)
json_obj = json.loads(json_str)
json_time = time.time() - start
# YAML
start = time.time()
yaml_str = yaml.dump(data)
yaml_obj = yaml.safe_load(yaml_str)
yaml_time = time.time() - start
print(f"JSON: {json_time:.4f}초") # ~0.0010초
print(f"YAML: {yaml_time:.4f}초") # ~0.0250초
결과: JSON이 약 25배 빠름 ⚡
파일 크기
같은 데이터: JSON (압축 안됨):{"name":"홍길동","age":30,"city":"서울"}
크기: 56 bytes
JSON (압축):
{"name":"홍길동","age":30,"city":"서울"}
크기: 56 bytes (공백 없음)
YAML:
name: 홍길동
age: 30
city: 서울
크기: 39 bytes
결과: YAML이 더 작을 수 있음 (주석 제외 시)
사용 사례
JSON이 더 나은 경우
fetch('/api/users')
.then(res => res.json())
.then(data => console.log(data));
db.users.insertOne({
name: "홍길동",
age: 30
});
{
"name": "my-app",
"version": "1.0.0"
}
- 프로그램 간 통신
- 브라우저와 서버 간
- 실시간 데이터
- 로그 처리
YAML이 더 나은 경우
# docker-compose.yml
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
# Ansible playbook
- hosts: webservers
tasks:
- name: Install nginx
apt:
name: nginx
state: present
# 애플리케이션 설정
database:
# 개발 환경 설정
host: localhost
port: 5432
- Kubernetes manifests
- OpenAPI specifications
- 설정 관리
- 템플릿 파일
언어별 지원
JavaScript/Node.js
JSON (내장):const data = JSON.parse(jsonString);
const json = JSON.stringify(data);
YAML:
npm install js-yaml
const yaml = require('js-yaml');
const data = yaml.load(yamlString);
const yamlStr = yaml.dump(data);
Python
JSON (내장):import json
data = json.loads(json_string)
json_str = json.dumps(data)
YAML:
pip install PyYAML
import yaml
data = yaml.safe_load(yaml_string)
yaml_str = yaml.dump(data)
변환
JSON to YAML
Python:import json
import yaml
# JSON 읽기
with open('data.json', 'r') as f:
data = json.load(f)
# YAML로 저장
with open('data.yaml', 'w') as f:
yaml.dump(data, f, allow_unicode=True)
JavaScript:
const fs = require('fs');
const yaml = require('js-yaml');
const json = JSON.parse(fs.readFileSync('data.json', 'utf8'));
const yamlStr = yaml.dump(json);
fs.writeFileSync('data.yaml', yamlStr);
YAML to JSON
Python:import json
import yaml
# YAML 읽기
with open('data.yaml', 'r') as f:
data = yaml.safe_load(f)
# JSON으로 저장
with open('data.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
CLI:
# yq 사용
yq eval -o=json data.yaml > data.json
# Python
python -c "import sys, yaml, json; json.dump(yaml.safe_load(sys.stdin), sys.stdout, indent=2)" < data.yaml > data.json
보안 고려사항
YAML 보안 위험
위험한 YAML:# 임의 Python 코드 실행 가능 (yaml.load 사용 시)
!!python/object/apply:os.system
args: ['rm -rf /']
안전한 파싱:
# ❌ 위험
data = yaml.load(yaml_string)
# ✅ 안전
data = yaml.safe_load(yaml_string)
JSON 보안
JSON은 데이터만 포함하므로 상대적으로 안전:
// ❌ eval 사용 금지
const data = eval('(' + jsonString + ')');
// ✅ JSON.parse 사용
const data = JSON.parse(jsonString);
실제 프로젝트 예제
Docker Compose (YAML)
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgres://db:5432
depends_on:
- db
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
volumes:
postgres_data:
package.json (JSON)
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node index.js",
"test": "jest"
},
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"jest": "^27.0.0"
}
}
모범 사례
JSON
{
"name": "홍길동",
"age": 30
}
- JSON Schema
- Linter
{"name":"홍길동","age":30}
YAML
user:
name: 홍길동
age: 30
# 사용자 설정
user:
name: 홍길동 # 실명
age: 30
data = yaml.safe_load(yaml_string)
결정 가이드
JSON 선택
- ✅ API 개발
- ✅ 성능이 중요
- ✅ 브라우저 통신
- ✅ 간단한 데이터 구조
YAML 선택
- ✅ 설정 파일
- ✅ 가독성이 중요
- ✅ 주석 필요
- ✅ 복잡한 계층 구조
결론
JSON과 YAML은 각각 장단점이 있습니다. API와 데이터 교환에는 JSON, 설정 파일과 문서화에는 YAML을 선택하세요.
핵심 요약:- ✅ JSON: 빠르고 보편적
- ✅ YAML: 읽기 쉽고 유연
- ✅ 프로젝트 요구사항에 따라 선택
- ✅ 보안 고려 (YAML)
- ✅ 도구로 변환 가능
지금 바로 JSON Simplify에서 JSON을 테스트해보세요!
관련 글
JSON이란 무엇인가? JavaScript Object Notation 완벽 가이드
JSON(JavaScript Object Notation)의 기본 개념부터 실제 활용까지. 웹 개발의 필수 데이터 형식인 JSON을 완벽하게 이해해보세요.
JSON vs XML: 2026년 데이터 형식 비교
JSON과 XML의 차이점, 장단점, 사용 사례를 상세히 비교합니다. 프로젝트에 적합한 데이터 형식을 선택하는 방법을 알아보세요.
JSON Schema 이해하기: 완벽한 가이드 2026
JSON Schema로 데이터를 검증하고 문서화하는 방법을 배우세요. 기본부터 고급 패턴까지 다루는 종합 가이드입니다.