파이프라인을 설계 할 때, 크론잡을 만들 때, Dockerfile을 작성하거나 Kubernetes를 구성할 때, 우리가 필수로 마주하는 요소가 있다. 바로 yaml/yml 파일
이다. 회사에 입사한지 일주일만에 큰 언론사의 서버 구축을 당시에 나도 함께 맡았는데, 그 과정에서 빌드가 제대로 안되었던 것 때문에 두 시간 동안 그 원인을 찾고자 애먹은적이 있었다. 알아보니, yaml 파일에서 space bar 하나가 삽입되어서 형식이 깨졌고 그로 인해 빌드가 제대로 안되었던 것이다. 과거의 그 경험으로 인해 yaml 파일을 다루는 방법이 중요하다는 것을 실감했고 작성법을 찾아서 공부했다. 이 글은 나와 같은 삽질을 줄이고 가급적 engineering job에 소프트랜딩을 할 수 있도록 돕기 위해 작성된 글 이다.
Yet Another Markup Language
의 약자로, 사람이 읽을 수 있는 데이터 직렬화 언어이다. 최근에는 YAML Ain't Markup Language
라고 불리는 우스갯 소리도 있다.
사람이 읽을 수 있는 언어라는 수식어가 붙어서 이상하게 들릴 수도 있다. 왜냐면 xml 파일
도 우리가 읽을 수 있고 Json 파일
도 읽는데 지장은 없기 때문이다. 그렇다면 YAML은 저 두 유형의 파일과 어떻게 다른 것일까? 라는 질문이 생길 수 있다.
사진 출처: 인프런 페이지 - yaml 설명
셋의 차이가 보이는가? yaml 파일은 셋팅에서 필요한 스펙과 프로퍼티값이 한 눈에 들어온다. 파일 작성도 다른 양식에 비해 매우 편리하다. 그러므로 많이 애용하는 것이다.
key-Value
구성으로 작성된 파일입니다.block Sequence
는 각각의 entry 마다 dash + space bar(공백)
으로 구성합니다.:
으로 구분합니다. 시작('...' 삽입)
과 끝('' 삽입)
을 지정 할 수 있습니다. (선택 사항)space bar
하나로 들여쓰기를 합니다.key
와 value
사이에 공백이 존재해야 합니다.'#' 태그
를 달아서 사용합니다. 파이썬과 동일한 규칙입니다.이를 정리해서 아래와 같은 예시를 가져오겠습니다. (공식문서 예제)
---
hr: # 1998 hr ranking
- Mark McGwire
- Sammy Sosa
rbi:
# 1998 rbi ranking
- Sammy Sosa
- Ken Griffey
...
&
를 붙여서 중복의 시작을 선언하고, 더이상 반복 선언이 필요하지 않을 때는 노드의 앞에 *
를 붙여서 마감한다.# 'Sammy Sosa' 노드가 반복되는 경우 - SS로 라벨을 붙여서 선언
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa
rbi:
- *SS # Subsequent occurrence
- Ken Griffey
? + Space bar(공백)
으로 조건이 포함된 매핑 키를 선언할 수 있습니다. block collenction
내에서 key-value는 ? 바로 뒤에 선언하는 것이 가능합니다.# mapping between sequences
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees,
Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
2001-08-14 ]
# Nested mapping
---
# Products purchased
- item : Super Hoop
quantity: 1
- item : Basketball
quantity: 4
- item : Big Shoes
quantity: 1
@Value
와 @ConfigurationProperties
두 가지의 어노테이션을 사용해서 데이터 매핑을 할 수 있다.
@ConfigurationProperties
은 메타데이터 지원과 유연한 바인딩이 가능하기 때문에 @Value
보다 많은 상황에서 두루 쓰이는 장점이 있다.
고정 값을 매핑하는 경우, @Value
를 사용해서 구성하는 것이 더 간편하고 가독성이 좋다.
application.yml
에 Youtube
를 Key 값으로 하는 리스트 데이터 작성Youtube:
channel:
- name : penbird
type : keyboard and hand writings
- name : kyleschool
type : data science and engineering
- name : habithackers
type : opct training
@ConfigurationProperties
에 Youtube
객체를 바인딩 한다.@Data
@Component
@ConfigurationProperties("Youtube")
public class YoutubeProperty {
private List<Youtube> channel;
public YoutubeProperty(List<Map<String, String>> channel) {
this.channel = channel;
}
public List<Map<String, String>> getChannel() {
return channel;
}
}
@SpringBootTest
class YoutubePropertyTest {
@Autowired
private YoutubeProperty youtubeProperty;
@DisplayName("Property build Test at Springboot")
@Test
void configurationPropertyTest() {
List<Map<String, String>> channel = YoutubeProperty.getChannel();
assertAll(
() -> assertThat(channel).hasSize(3),
() -> assertThat(channel.get(0).get("name")).isEqualTo("penbird"),
() -> assertThat(channel.get(0).get("type")).isEqualTo("keyboard and hand writings")
);
}
}
이렇게 yaml/yml
의 구조와 문법 그리고 SpringBoot
에서 사용하는 방법을 간단히 알아봤습니다. 다음편에는 yaml/yml의 작동 원리와 dockerfile 에서의 구성을 살펴보도록 하겠습니다.
감사합니다.