본문 바로가기
C.W.K.
Stream
Lesson 06 of 08 · published

Anchor & alias — DRY YAML

~12 min · yaml, anchors, aliases, merge-keys

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

&anchor 로 한 번 정의, *alias 로 재사용

YAML 은 anchor 를 지원해. 노드에 &name 으로 이름을 달아두는 거야. 그리고 나중에 alias 로, 그러니까 *name 으로 그 자리를 다시 불러와. 파싱된 결과는 같은 노드 값을 다시 쓰게 되는데, 파서가 깊은 복사를 하느냐에 따라 사본 두 개가 되기도 해.

Merge key (<<:)

Merge key 는 YAML 1.1 확장이야. <<: *base 라고 쓰면 anchor 를 단 맵의 키를 전부 지금 맵에 합쳐줘. 이름이 겹치면 지금 맵 쪽이 이기고. docker-compose 나 CI config 가 base config 를 중복 없이 나눠 쓰는 방식이 이거야.

다만 조심할 게 있어. merge key 는 YAML 1.2 spec 에는 없어. 그래도 PyYAML, ruamel, js-yaml 을 비롯해 실제로 굴러가는 도구 대부분이 아직 지원해. '거의 어디서나 되긴 하는데, 기대기 전에 내 파서부터 확인한다' 정도로 다뤄.

언제 anchor 잡나

노드 둘 이상이 항상 같은 값을 유지해야 할 때야. anchor 가 없으면 고칠 자리가 두 군데지만, anchor 를 쓰면 진짜 값은 한 군데뿐이야. 대신 읽을 때 한 단계를 더 따라가야 하는 비용이 붙어. 반복이 실제로 있을 때만 그 값을 해.

원칙: anchor 와 alias 는 YAML 판 변수야. 반복되는 config 를 관리 가능한 상태로 붙잡아줘. 남발하면 파일이 안 읽히고, 반대로 안 쓰면 똑같은 env-var 뭉치를 세 벌 관리하게 돼. '세 번 넘게 쓰이면 anchor 로 뺀다' 를 기준으로 삼아.

Code

반복 값에 anchor + alias·yaml
default_timeout: &timeout 30

endpoints:
  - name: search
    timeout: *timeout
  - name: index
    timeout: *timeout
  - name: admin
    timeout: *timeout
공유 base config 에 merge key·yaml
base_service: &base
  image: ghcr.io/cwk/api:1.0
  restart: unless-stopped
  environment:
    LOG_LEVEL: info

services:
  api:
    <<: *base
    ports: ["8000:8000"]
  worker:
    <<: *base
    command: ["python", "worker.py"]
  admin:
    <<: *base
    ports: ["8001:8001"]
    environment:
      LOG_LEVEL: debug   # base override
리스트 요소에 anchor·yaml
shared_env: &shared_env
  - name: TZ
    value: Asia/Seoul
  - name: LOG_LEVEL
    value: info

containers:
  - name: api
    env: *shared_env
  - name: worker
    env: *shared_env

External links

Exercise

설정이 서로 겹치는 service 가 여럿 있는 docker-compose.yaml 을 골라. 겹치는 부분을 anchor 로 빼내고 <<: *base 로 끌어다 써. 그리고 docker compose config 를 돌려서 파싱된 결과가 전과 똑같은지 확인해. 그러면 몸으로 알게 될 거야. anchor 는 YAML 에서 하는 리팩토링이라는 걸.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.