📊데이터공학

YAML

YAML Ain't Markup Language

사람이 읽기 쉬운 데이터 직렬화 형식. 설정 파일, K8s 매니페스트에 널리 사용.

상세 설명

YAML(YAML Ain't Markup Language)은 사람이 읽고 쓰기 쉬운 데이터 직렬화 포맷입니다. 들여쓰기로 구조를 표현하는 특징 때문에 JSON보다 가독성이 높고, 주석을 지원하여 설정 파일에 최적화되어 있습니다. 쿠버네티스, Docker Compose, Ansible, GitHub Actions 등 DevOps 도구의 표준 설정 형식으로 자리잡았습니다.

YAML은 스칼라(문자열, 숫자, 불린), 시퀀스(배열), 매핑(객체) 세 가지 기본 타입을 지원합니다. 앵커(&)와 별칭(*)으로 중복 데이터를 참조하여 DRY(Don't Repeat Yourself) 원칙을 적용할 수 있으며, 여러 문서를 ---로 구분하여 하나의 파일에 담을 수 있습니다.

YAML 1.2는 JSON의 상위 집합(Superset)으로, 모든 유효한 JSON은 유효한 YAML입니다. 그러나 들여쓰기 오류, 탭 사용 금지, 암묵적 타입 변환(yes/no가 불린으로 해석) 등 주의할 점이 있습니다. yamllint, yaml-language-server 같은 도구로 문법 오류를 방지합니다.

복잡한 설정 관리를 위해 Helm(Kubernetes), Kustomize는 YAML 템플릿팅과 오버레이 기능을 제공합니다. Python의 PyYAML, ruamel.yaml, JavaScript의 js-yaml 등 대부분의 언어에서 파서 라이브러리를 지원합니다.

코드 예제

# YAML 앵커/별칭 및 Kubernetes 설정 예제

# ========== 앵커와 별칭으로 중복 제거 ==========
defaults: &defaults
  adapter: postgres
  host: localhost
  pool: 5

development:
  <<: *defaults      # defaults 병합
  database: myapp_dev

production:
  <<: *defaults      # defaults 병합
  host: db.production.com
  database: myapp_prod
  pool: 25

# ========== Kubernetes Deployment 매니페스트 ==========
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
  namespace: production
  labels: &app-labels    # 앵커 정의
    app: api-server
    environment: production
    version: v2.1.0
spec:
  replicas: 3
  selector:
    matchLabels:
      <<: *app-labels    # 별칭으로 재사용
  template:
    metadata:
      labels:
        <<: *app-labels
    spec:
      containers:
        - name: api
          image: myregistry/api-server:v2.1.0
          ports:
            - containerPort: 8080
              protocol: TCP
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: url
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"

실무에서 이렇게 말해요

시니어: "Helm 차트 values.yaml에서 공통 설정은 앵커로 빼고, 환경별로 오버라이드하면 중복을 줄일 수 있어요."

주니어: "앵커가 뭔가요?"

시니어: "&defaults로 정의하고 *defaults로 참조하는 거예요. <<: *defaults 쓰면 병합도 돼요."

면접관: "YAML과 JSON의 차이점과 각각 어떤 상황에서 사용하나요?"

지원자: "YAML은 주석 지원, 가독성, 앵커/별칭이 장점이라 설정 파일에 적합합니다. JSON은 파싱이 빠르고 엄격해서 API 통신에 적합합니다."

시니어: "여기 on: true가 문자열 'on'이 아니라 불린 true로 파싱돼요. 문자열로 쓰려면 'on'처럼 따옴표로 감싸세요."

주니어: "아, 그래서 CI가 안 돌았군요. 따옴표 추가하겠습니다."

주의사항

더 배우기