yaml 파일 작성 요령 (기초편, 스프링편)

Spes Lim·2021년 1월 14일
14

back-end

목록 보기
1/1

파이프라인을 설계 할 때, 크론잡을 만들 때, Dockerfile을 작성하거나 Kubernetes를 구성할 때, 우리가 필수로 마주하는 요소가 있다. 바로 yaml/yml 파일이다. 회사에 입사한지 일주일만에 큰 언론사의 서버 구축을 당시에 나도 함께 맡았는데, 그 과정에서 빌드가 제대로 안되었던 것 때문에 두 시간 동안 그 원인을 찾고자 애먹은적이 있었다. 알아보니, yaml 파일에서 space bar 하나가 삽입되어서 형식이 깨졌고 그로 인해 빌드가 제대로 안되었던 것이다. 과거의 그 경험으로 인해 yaml 파일을 다루는 방법이 중요하다는 것을 실감했고 작성법을 찾아서 공부했다. 이 글은 나와 같은 삽질을 줄이고 가급적 engineering job에 소프트랜딩을 할 수 있도록 돕기 위해 작성된 글 이다.

what is a 'YAML'/'YML'?

  • Yet Another Markup Language의 약자로, 사람이 읽을 수 있는 데이터 직렬화 언어이다. 최근에는 YAML Ain't Markup Language라고 불리는 우스갯 소리도 있다.

  • 사람이 읽을 수 있는 언어라는 수식어가 붙어서 이상하게 들릴 수도 있다. 왜냐면 xml 파일도 우리가 읽을 수 있고 Json 파일도 읽는데 지장은 없기 때문이다. 그렇다면 YAML은 저 두 유형의 파일과 어떻게 다른 것일까? 라는 질문이 생길 수 있다.


사진 출처: 인프런 페이지 - yaml 설명

셋의 차이가 보이는가? yaml 파일은 셋팅에서 필요한 스펙과 프로퍼티값이 한 눈에 들어온다. 파일 작성도 다른 양식에 비해 매우 편리하다. 그러므로 많이 애용하는 것이다.

YAML/YML 파일의 구성 및 작성법

  • key-Value 구성으로 작성된 파일입니다.
  • YAML/YML 파일은 Json 파일과 상위 호환되기 때문에, Json 시퀀스와 맵을 사용할 수 있습니다.

YAML의 기본 자료형

  • 스칼라(Scalar) : String 혹은 숫자
  • 시퀀스(Sequence): 배열 혹은 리스트
  • 매핑(Mapping): 해시 혹은 딕셔너리, key-value 쌍

Collections

  • block Sequence는 각각의 entry 마다 dash + space bar(공백)으로 구성합니다.
  • Key-Value의 매핑은 :으로 구분합니다.
  • 문서의 시작('...' 삽입)끝('' 삽입)을 지정 할 수 있습니다. (선택 사항)
  • tab 키가 아닌 space bar 하나로 들여쓰기를 합니다.
  • keyvalue 사이에 공백이 존재해야 합니다.
  • 주석(Comment)은 '#' 태그를 달아서 사용합니다. 파이썬과 동일한 규칙입니다.

이를 정리해서 아래와 같은 예시를 가져오겠습니다. (공식문서 예제)

---
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

[Spring] application.yml에 데이터 매핑을 해보자.

  • @Value@ConfigurationProperties 두 가지의 어노테이션을 사용해서 데이터 매핑을 할 수 있다.

  • @ConfigurationProperties은 메타데이터 지원과 유연한 바인딩이 가능하기 때문에 @Value보다 많은 상황에서 두루 쓰이는 장점이 있다.

  • 고정 값을 매핑하는 경우, @Value를 사용해서 구성하는 것이 더 간편하고 가독성이 좋다.

  1. application.ymlYoutube를 Key 값으로 하는 리스트 데이터 작성
Youtube:
 channel:
  - name : penbird
    type : keyboard and hand writings
  - name : kyleschool
    type : data science and engineering
  - name : habithackers
    type : opct training
  1. @ConfigurationPropertiesYoutube객체를 바인딩 한다.
@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;
    }

}
  1. 테스트 수행
@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 에서의 구성을 살펴보도록 하겠습니다.

profile
Software Developer

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

감사합니다.

답글 달기