우리가 타 시스템 간에 데이터를 주고 받을 필요가 있을때 데이터의 연동과 호환성을 위해 포맷에 대한 규칙이 필요하게 된다.
한번 쯤 들어보았고, 또한 이때까지 자주 사용해왔던 CSV, XML, JSON, Properties 등이 바로 그것이다.
기존에는 웹에서는 XML과 JSON으로 그리고 자바 프로젝트에서는 properties 파일을 이용하여 어떤 값들을 정의하고 저장하고 사용해왔다.
XML은 사용하기 매우 까다롭고 가독성도 좋지 않기 때문에 요즘 들어 JSON 포매팅 방식으로 많이 이용되는 편이지만, JSON 역시 주석을 달수 없는 등 약간의 제한이 있고 쓸데없는 중괄호와 대괄호의 남발로 코드 길이가 강제적으로 길어지게 된다는 단점이 있다.
이러한 사용하기가 복잡하다는 점 때문에 2001년에 Clark Evans에 의해 최초 제안된 새로운 포매팅 방식이 YAML / YML 이다.
yaml은 xml과 json 포맷과 같이 타 시스템 간에 데이터를 주고받을 때 약속된 포맷(규칙)이 정의되어있는 또 하나의 파일 형식이라고 보면 된다.
다만 좀더 인간 친화적으로 작성해 가독성을 높이는 쪽으로 무게를 두었다.
그래서 고급 컴퓨터 언어에 친화적이다.
json과 달리 주석도 쓸수 있으며, 위의 사진과 같이 간결한 문법으로 같은 데이터량이라도 코드길이를 많이 줄일수 있다.
yaml은 주로Doker Compose, Kubernetes, Flutter, Spring boot 프로젝트에서 설정파일을 정의할때 자주 애용된다.
[ Yaml 이름 어원 ] Yaml의 뜻은 'Yaml Ain't Markup Language' 라는 뜻으로 'YAML은 마크업 언어가 아니다'라는 재귀적 말장난 같은 이름을 가지고 있다. 이게 무슨 소리인가 싶겠지만, 사실 YAML은 Yet Another Markup Language로 또 다른 마크업 언어라는 이름을 가지고 있다가 마치 NoSQL이 Not Only SQL로 뜻이 변화했듯이, 핵심은 마크업이 아니라 데이터가 중심이라는 보여주기 위해 Yaml Ain't Markup Language가 되어 버렸다고 보면 된다.
[ .yaml 과 .yml 차이점 ] 결론부터 말하자면 yaml과 yml파일 확장자는 모두 해석 및 구문이 동일하다. 즉, 어떤식으로 파일확장자를 짓든 똑같은 것이다. 이렇게 분리된 이유는, 옛날 Windows에서 Extensions는 파일확장자가 3자로 제한되는 특성이 있었기 때문이다. 그래서 예전에는 .html 대신 .htm 으로도 쓰였는데 이와 같은 원리이다. 하지만 요즘은 확장자에 3글자를 넣어야 하는 OS 시스템 수준의 시행이 없으니, 그냥 단순하게 .yaml을 사용하자.
yaml 문법 생김새를 보면 무언가 파이썬 스럽다는 것을 느낄 수 있다.
json은 중괄호를 이용해 데이터간의 구분을 표현하지만, 실제로 yaml은 띄어쓰기로 데이터 구분을 하기 때문이다.
문득, json과 yaml 간의 활용도 차이점에 대해 궁금할 수 도 있다.
문법 생김새만 다를뿐 데이터를 표현하고자 하는 의도는 둘이 같으니, 마치 프로그래밍 언어를 시작할때 자바로 할지 파이썬으로 할지 선택을 고민하는 선택장애가 오는 것과 비슷하다.
이에 대해 간단히 정리하자면, 대부분의 웹에서 데이터 통신을 위해 JSON을 많이 사용하고, reference를 정의할때 복잡한 object 구조를 표현 하기 위해 YAML이 적합하다고 보면 된다.
YAML 모델이 JSON 보다 좀 더 복잡하기 때문에 파싱하고 생성하는데 YAML이 더 느리다.
또한 문법 생김새로 인해, 파이썬 커뮤니티에서는 파이썬 문법과 비슷한indent로 구분하는 YAML을 더 선호하고, 자바스크립트 진영에서는 별도의 파서가 필요없고 Javascript Object와 구조가 유사한 JSON을 선호하기도 한다.
YAML 문법 정리
yaml 포맷에는 고급 프로그래밍에 어울리다고 말한만큼 은근히 많은 문법들이 있다.
yaml 문법은 기존 프로그래밍 언어와 달리 많이 생소 하기 때문에 문법을 설명할때 우리에게 익숙한 json 포맷과 차이를 비교하여 설명할 예정이다.
다음 사이트에서는 YAML 예제를 입력하면 자동으로 JSON으로 변환되어, 해당 문법이 어떤 것을 의미하되는지 쉽게 확인할 수 있다.
이외에도 입력한 YAML에 문법상 오류가 있다면 오류 메시지가 출력되기도 하여, 문맥 확인/학습에 도움을 줄 수 있다.
중복된 데이터가 여러번 반복되어 나열된다면 json 포맷에서는 하는수 없이 일일히 기재하여야 한다.
만일 중복되어 나열되는 데이터가 1000개 10000개 라면 꽤나 큰 용량 낭비가 된다.
이처럼 재사용하는 값 또는 구조체 등이 있을 경우, 보통 고급 프로그래밍 언어에서는 변수나 함수로 선언해 할당하는 식으로 구조를 짠다.
yaml에서도 이러한 변수와 비슷한 태그 기능을 지원해주는데, & 기호로 변수를 선언하고, * 기호로 변수를 참조(사용) 할 수 있다.
이를 이용해 반복되는 데이터 부분을 태그 하고 참조하는 식으로 구성해 놓으면, 보다 가독성 높게 데이터를 구성 할 수 있다.
default: &default_school # default_school 라는 변수를 선언하고, 그 내용은 group 과 description 데이터를 지니고 있다
group: '서울대학교'
description: |
서울에 위치하는 대한민국 대학교!
student:
- name: '홍길동'
<<: *default_school # default_school 변수 내용물을 대입한다
- name: '임꺽정'
<<: *default_school # default_school 변수 내용물을 대입한다
{
"default": {
"group": "서울대학교",
"description": "서울에 위치하는 대한민국 대학교!\n"
},
"student": [
{
"name": "홍길동",
"group": "서울대학교",
"description": "서울에 위치하는 대한민국 대학교!\n"
},
{
"name": "임꺽정",
"group": "서울대학교",
"description": "서울에 위치하는 대한민국 대학교!\n"
}
]
}
artist:
artist-alias1: &MK # 변수 선언
name: Mika
albums:
- Life in Cartoon Motion
- The Boy Who Knew Too Much
artist-alias2: &MJ # 변수 선언
name: Michael Jackson
albums:
- Off the Wall
- Thriller
- Bad
students:
- name: Mark
major: Math
age: 20
favorites: [*MK, *MJ] # 변수 할당
- name: Julie
major: Arts
age: 23
favorites: [*MK] # 변수 할당
{
"artist": {
"artist-alias1": {
"name": "Mika",
"albums": [
"Life in Cartoon Motion",
"The Boy Who Knew Too Much"
]
},
"artist-alias2": {
"name": "Michael Jackson",
"albums": [
"Off the Wall",
"Thriller",
"Bad"
]
}
},
"students": [
{
"name": "Mark",
"major": "Math",
"age": 20,
"favorites": [
{
"name": "Mika",
"albums": [
"Life in Cartoon Motion",
"The Boy Who Knew Too Much"
]
},
{
"name": "Michael Jackson",
"albums": [
"Off the Wall",
"Thriller",
"Bad"
]
}
]
},
{
"name": "Julie",
"major": "Arts",
"age": 23,
"favorites": [
{
"name": "Mika",
"albums": [
"Life in Cartoon Motion",
"The Boy Who Knew Too Much"
]
}
]
}
]
}
Multiple Documents
마지막으로 yaml 에는 두 파일의 데이터를 하나의 파일로 포함시켜 표현해주는 기능을 제공해준다.
스프링 프로젝트 환경이 dev냐 product 환경이냐에 따라 적용되는 옵션 값들이 다른 설정 프로퍼티 파일들인데, yaml에서는 하이픈 3개를 이용하여 --- 이 두 옵션 파일을 하나의 파일에 포함시켜 한꺼번에 정의해줄 수 있다.
다만, 이러한 방법은 오히려 특정 환경의 설정만 바꾸고 싶은데 똑같은 key들이 환경별로 있어서 헷갈린다는 사람도 있을 것이고, 하나의 파일에서 설정을 다 바꿀 수 있어서 여기 저기 다른 파일을 탐색하지 않아서 좋다고 하는 사람도 있을 수 있을 것이다. 따라서 자기 취향 혹은 팀의 가이드라인을 따라 사용하면 된다.