alltools.one
YAML
2025-06-13
5 min
alltools.one Team
YAMLMinificationOptimizationConfigurationPerformance

YAML 축소: YAML 파일을 압축하는 시기와 방법

YAML의 가독성은 공백과 들여쓰기의 넉넉한 사용에서 비롯됩니다. 하지만 때때로 전송, 다른 포맷에 포함, 저장 공간 절감을 위해 더 컴팩트한 형태의 데이터가 필요합니다. 이 가이드에서는 축소가 적합한 시기와 이를 달성하는 기법을 다룹니다.

YAML 축소란?

축소는 데이터 구조를 유지하면서 불필요한 공백을 제거합니다:

이전 (168 바이트):

server:
  host: localhost
  port: 8080
  features:
    - auth
    - logging
    - monitoring

이후 — Flow 스타일 (76 바이트):

server: {host: localhost, port: 8080, features: [auth, logging, monitoring]}

이후 — JSON (동일 데이터, 83 바이트):

{"server":{"host":"localhost","port":8080,"features":["auth","logging","monitoring"]}}

YAML의 Flow 스타일은 키에 따옴표가 필요하지 않아 JSON보다 약간 더 컴팩트합니다.

언제 축소해야 하나

축소하세요

  • 다른 포맷에 YAML 포함: JSON이나 데이터베이스 필드 안에 YAML 문자열 저장
  • 네트워크 전송: 고처리량 시스템의 페이로드 크기 줄이기
  • 로그 출력: 로그 메시지에서의 컴팩트 표현
  • 생성된 출력: 사람이 거의 읽지 않는 기계 생성 YAML

축소하지 마세요

  • 설정 파일: 가독성이 YAML 사용의 핵심
  • 버전 관리 파일: 축소된 YAML은 끔찍한 diff를 만듦
  • 협업 파일: 팀원이 읽고 편집해야 함
  • 템플릿과 예제: 문서적 가치가 사라짐

축소 기법

1. Flow 스타일로 변환

YAML은 매핑과 시퀀스 모두에 인라인 표기법을 지원합니다:

# Block 스타일 (읽기 쉬움)
database:
  host: localhost
  port: 5432
  options:
    - sslmode=require
    - timeout=30

# Flow 스타일 (컴팩트)
database: {host: localhost, port: 5432, options: [sslmode=require, timeout=30]}

2. 주석 제거

주석은 데이터 가치가 없으며 안전하게 제거할 수 있습니다:

# 이전
server:
  host: localhost  # 메인 서버
  port: 8080       # HTTP 포트

# 이후
server:
  host: localhost
  port: 8080

3. 빈 줄 제거

추가 빈 줄은 가독성을 개선하지만 바이트를 추가합니다:

# 이전 (구분 줄 포함)
database:
  host: localhost

logging:
  level: info

# 이후 (컴팩트)
database:
  host: localhost
logging:
  level: info

4. JSON으로 변환

YAML 전용 기능 (주석, 앵커)이 필요하지 않으면, 축소된 JSON으로 변환하는 것이 가장 컴팩트한 옵션입니다:

# yq 사용
yq -o=json '.' config.yaml | jq -c . > config.min.json

커맨드 라인 축소

# yq로 Flow 스타일로 변환
yq -o=yaml '.. style="flow"' config.yaml

# 컴팩트 JSON으로 변환
yq -o=json -I=0 '.' config.yaml

# sed로 주석 제거 (기본)
sed '/^[[:space:]]*#/d' config.yaml | sed 's/[[:space:]]*#.*//'

# Python 원라이너
python3 -c "
import yaml, sys
data = yaml.safe_load(sys.stdin)
yaml.dump(data, sys.stdout, default_flow_style=True, width=10000)
" < config.yaml

인터랙티브 YAML 포맷팅과 축소에는 YAML 포매터를 사용하세요.

크기 비교

일반적인 Docker Compose 파일 (10개 서비스):

포맷크기비율
Block YAML (읽기 쉬움)2,400 바이트1.0x
Flow YAML (축소됨)1,100 바이트0.46x
JSON (축소됨)1,200 바이트0.50x
Gzip (Block YAML)650 바이트0.27x

핵심 인사이트: Gzip 압축이 축소보다 훨씬 효과적입니다. gzip이 활성화된 (표준 관행) HTTP로 YAML을 전송하는 경우, 축소는 추가적인 이점이 미미합니다.

더 나은 대안: 압축

네트워크 전송에서 HTTP 압축 (gzip, brotli)은 거의 항상 축소보다 낫습니다:

  • Gzip은 Block 스타일 YAML을 70-80% 줄임
  • 읽기 쉬운 포맷이 축소된 포맷과 비슷한 크기로 압축됨
  • 디버깅을 위한 가독성 유지
Block YAML → Gzip: 2,400 → 650 바이트 (73% 감소)
Flow YAML → Gzip: 1,100 → 580 바이트 (47% 감소)

압축된 Block과 압축된 Flow의 차이는 미미합니다.

FAQ

축소된 YAML은 여전히 유효한 YAML인가요?

네. Flow 스타일 YAML은 완전히 유효하며 모든 YAML 파서에서 파싱 가능합니다. 매핑에 중괄호, 시퀀스에 대괄호를 사용합니다 — 본질적으로 YAML 안의 JSON 유사 구문입니다. 데이터 구조는 동일하며 포맷만 다릅니다.

Kubernetes 매니페스트를 축소해야 하나요?

아닙니다. Kubernetes 매니페스트는 읽기 쉽고, 버전 관리되며, 쉽게 편집 가능해야 합니다. 표준 Block 스타일 YAML을 사용하세요. 전송 크기를 줄여야 한다면 배포 도구가 압축을 처리하게 하세요. Helm 차트와 Kustomize 오버레이가 축소보다 YAML 복잡성을 더 잘 관리합니다.

관련 리소스

Published on 2025-06-13
YAML Minification: When and How to Compress YAML Files | alltools.one