[Yaml] 앵커(anchor)

닻

yaml에서 반복되는 부분을 줄일 수 있는 기능이 있는데, 바로 앵커(anchor)다.

&로 정의하고, *로 사용할 수 있다.

사용 예시

단순 value

anchored_content: &anchor_name TEST_STRING
other_anchor: *anchor_name

위처럼 단순한 value를 정의하면, 아래 json과 동일하다

{
  "anchored_content": "TEST_STRING", 
  "other_anchor": "TEST_STRING"
}

key/value

anchored_content: &anchor_name
- key1: value1
  key2: value2

other_anchor: *anchor_name

key/value를 넣을 수도 있다

{
  "anchored_content": [
    {
      "key2": "value2", 
      "key1": "value1"
    }
  ], 
  "other_anchor": [
    {
      "key2": "value2", 
      "key1": "value1"
    }
  ]
}

map merging

base: &base
  name: Everyone has same name

foo:
  <<: *base # 이미 name이 있어 머지되지 않는다
  age: 10
  name: John
bar:
  <<: *base # 여긴 머지된다
  age: 20

<<를 key 부분에 쓰면 anchor map을 현재 map에 병합시킨다

주의할 점은 이미 해당 map에 key가 있다면 병합에서 제외된다.

{
  "base": {
    "name": "Everyone has same name"
  }, 
  "bar": {
    "age": 20, 
    "name": "Everyone has same name"
  }, 
  "foo": {
    "age": 10, 
    "name": "John"
  }
}

multiple

anchor1: &anchor1
  x: 1
  y: 2

anchor2: &anchor2
  key1: value1
  key2: value2

merge_arr:
  <<: [*anchor1, *anchor2]

just_arr: [*anchor1, *anchor2]

위처럼 여러개 앵커를 사용할 수도 있다

{
  "anchor2": {
    "key2": "value2", 
    "key1": "value1"
  }, 
  "merge_arr": {
    "y": 2, 
    "key2": "value2", 
    "key1": "value1", 
    "x": 1
  }, 
  "just_arr": [
    {
      "y": 2, 
      "x": 1
    }, 
    {
      "key2": "value2", 
      "key1": "value1"
    }
  ], 
  "anchor1": {
    "y": 2, 
    "x": 1
  }
}

참고자료

Learn yaml in Y Minutes
YAML Ain’t Markup Language (YAML™) revision 1.2.2
Merge Key Language-Independent Type for YAML™ Version 1.1