&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 로 뺀다' 를 기준으로 삼아.