yaml 또는 yaml 파일을 자주 보게 되는데요. 요즘 많은 소프트웨어와 애플리케이션에서 설정 파일을 작성하고 관리하는 데 YAML(YAML Ain't Markup Language)1형식을 자주 보게 되는데요. YAML은 괄호나 따옴표처럼 복잡한 구문 기호가 없고 들여쓰기에 기반한 구조와 간단한 반각기호로 구성된 키와 값 구분자가 사용되어 JSON과 비슷한 구조를 가졌습니다.
그래서 YAML형식을 사용하면 구성 파일과 같은 일반적인 사용자들이 쉽게 읽을 수 있는 중심적인 데이터 구조를 구성할 수 있습니다. 공식 사이트인 https://yaml.org 를 열어보면 사이트 레이아웃 자체가 YAML 형식으로 구성되어 있어 보다 단순하고 직접적인 정보 전달 방식을 가지고 있는 것을 확인할 수 있습니다.
이번 글에서는 YAML의 개념, 기본 사용법, 그리고 실전적인 팁들을 하나씩 정리해 보도록 하겠습니다.
튜토리얼 환경: YAML 1.2 버전
YAML이란
YAML은 사람과 기계 모두에게 읽기 쉬운 형식을 제공하며, 주로 설정 파일, 데이터 전송 및 저장 등에 사용됩니다. YAML은 프로그래밍 언어와 독립적이며, 다양한 프로그래밍 언어에서 지원되는 표준으로 사용됩니다. 우선 YAML 기본적인 정의 사용처와 YAML과 유사하게 활용되는 JSON과의 차이점도 같이 정리합니다.
기본적인 정의 사용처
- 구성 설정 파일: 소프트웨어나 프레임워크의 구성 설정 파일로 사용됩니다. 예를 들어, 서버 설정, 데이터베이스 연결 정보, 로깅 설정 등을 YAML 파일에 작성할 수 있습니다.
- 프레임워크 설정: 다양한 프레임워크에서 YAML을 사용하여 설정 정보를 관리합니다. 예를 들어, 웹 프레임워크에서 URL 라우팅 규칙, 데이터베이스 연결 정보, 보안 설정 등을 YAML 파일에 정의할 수 있습니다.
- 데이터 교환: YAML은 데이터를 표현하고 전송하기 위한 형식으로 사용될 수 있습니다. 다양한 시스템 간에 데이터를 교환하거나, 다른 시스템에서 처리할 수 있는 형식으로 변환하기 위해 YAML을 사용할 수 있습니다.
JSON과의 차이점
![JSON 과 YAML 비교](https://iboxcomein.com/wp-content/uploads/2023/06/230627_105857-JSON-과-YAML-비교.webp)
JSONJavaScript Object Notation 파일도 데이터 교환 형식을 나타내는 텍스트 파일입니다. JSON 파일은 .json
확장자를 가지며, 웹 상에서 데이터를 전송하는 데 주로 사용됩니다. YAML과 JSON은 모두 데이터 직렬화 형식으로 유사한 부분이 많지만, 다음과 같은 몇 가지 차이점이 있습니다.
- 가독성: YAML은 가독성에 더 초점을 맞춘 디자인으로, 들여쓰기를 사용하여 계층 구조를 표현하고 중괄호(
{}
)나 대괄호([]
) 등의 기호를 사용하지 않습니다. 반면에 JSON은 구조를 대괄호와 중괄호로 구분합니다. - 주석: YAML은 주석을 지원하며, '#' 문자를 사용하여 주석을 작성할 수 있습니다. JSON에서는 주석이 지원되지 않습니다.
- 기본 데이터 타입: YAML은 스칼라, 시퀀스, 매핑의 세 가지 기본 데이터 타입을 지원합니다. JSON은 기본 데이터 타입으로 문자열, 숫자, 부울, 객체, 배열, null을 지원합니다. 두 형식 모두 형식 간 변환을 지원하기 때문에 데이터 타입의 차이를 해결할 수 있습니다.
- 파싱 속도: JSON이 일반적으로 더 빠른 파싱 속도를 보이며, 더 대중적인 라이브러리나 파서를 지원합니다. YAML은 상대적으로 느린 파싱 속도를 가지고 있습니다.
- 용도: 일반적으로, JSON은 웹 API, 파이프라인, 프론트엔드 및 백엔드 사이의 응용 프로그램간 데이터 전송에 사용됩니다. 반면에 YAML은 구성 파일, 프레임워크 설정 등 인간과 직접적으로 인터랙션 하는 경우에 적합합니다.
기본 사용법
YAML의 기본 구조적인 요소들인 들여쓰기와 구분 등과 같은 중요한 작성법을 소개합니다.
기본 구문
key1: value1
key2:
- item1
- item2
key3:
nested_key1: nested_value1
nested_key2: nested_value2
위의 예제에서 key1
은 value1
을 가지고 있고, key2
는 리스트 형태로 item1
과 item2
를 가지고 있습니다. key3
는 중첩된 구조를 가지며, nested_key1
과 nested_key2
라는 하위 키를 가지고 있습니다.
- 키-값 쌍: 각 라인은 YAML에서 키-값 쌍을 나타냅니다.
key1
은value1
을 가지고 있는 키-값 쌍입니다.key2
는 리스트 형태로- item1
과- item2
를 가지고 있는 맵입니다.- 리스트는 하이픈(
-
)으로 시작하며, 여러 값을 포함하는 배열을 나타냅니다. key3
은 중첩된 구조를 가지는 맵입니다.nested_key1
과nested_key2
라는 하위 키를 가지며, 이들은 각각nested_value1
과nested_value2
값을 갖습니다.
- 들여쓰기와 구분: 들여쓰기는 계층 구조를 나타내는 데 사용됩니다.
- 예를 들어,
key2
와key3
는key1
과 같은 레벨에 있지 않고 들여쓰기로 구분되어 있습니다. 이것은key2
와key3
가key1
의 하위 요소임을 나타냅니다. - 들여쓰기는 공백 문자로 구성되며, 일반적으로 공백 2칸 또는 공백 4칸을 사용합니다. 중요한 것은 일관성을 유지하는 것입니다.
- 모든 하위 요소는 그들의 상위 요소와 동일한 들여쓰기를 가져야 합니다.
- 이를 통해 YAML은 계층 구조를 시각적으로 표현하고 데이터의 관계를 명확하게 표현할 수 있습니다.
- 예를 들어,
YAML을 이용한 대표적인 구성 파일의 예로 Docker Compose 파일을 들 수 있습니다. YAML 형식을 사용하여 구성 파일을 작성하면 코드의 가독성이 좋아지며, 데이터를 쉽게 파악할 수 있습니다.
version: '3.8'
services:
web:
build: .
ports:
- '80:80'
database:
image: 'mysql:5.7'
environment:
MYSQL_ROOT_PASSWORD: 'password'
MYSQL_DATABASE: 'app_db'
redis:
image: 'redis:alpine'
위의 예시는 다음과 같은 내용을 포함합니다.
version
: Docker Compose 구성 파일의 버전을 나타냅니다.services
: 이 컴포즈 파일에서 정의할 컨테이너(서비스) 목록을 나타냅니다.web
: 웹 서비스를 구성하며, 현재 디렉토리의 Dockerfile을 이용하여 빌드하고 호스트와 컨테이너의80
포트를 바인딩합니다.database
: MySQL 데이터베이스 서비스를 구성하며,mysql:5.7
이미지를 사용하고 환경변수를 설정합니다.redis
: Redis 데이터 저장소 서비스를 구성하며,redis:alpine
이미지를 사용합니다.
YAML의 다양한 요소
YAML의 다양한 요소에서는 목록, 사전, 스트링, 멀티라인 문자열 등 다양한 데이터 유형과 작성법을 설명합니다. 주석과 앵커 및 별칭 사용 등 주요 기능에 대해 다룹니다. 기본 문법에서 다룬 내용들이 중복될 수 있지만 이해를 돕기 위한 것이니 다시 한번 더 확인합니다.
목록 작성
YAML에서 목록은 순서가 지정된 항목의 컬렉션입니다. 목록 항목은 하이픈(-
)으로 시작하며, 균일한 들여쓰기를 사용합니다.
shopping_list:
- apples
- bananas
- oranges
groceries:
- fruits:
- apples
- bananas
- oranges
- vegetables:
- carrots
- lettuce
- spinach
mixed_data_list:
- item1
- 42
- True
- sub_list:
- item2
- item3
- key: value
YAML에서 목록은 강력한 구조를 제공합니다. 간단한 문자열을 나열하는 일상적인 작업에서부터 복잡한 데이터 구조를 표현하는 데 사용되며, 작성 및 파싱이 쉽게 되어 있어 이해하기 쉽게 합니다. 이러한 옵션들로 인해 YAML에서 목록의 사용성이 더욱 강화됩니다.
- 기본 문법: 목록 항목은 하이픈(
-
)으로 시작하며, 각 항목은 하이픈 앞에서 동일한 들여쓰기를 사용해야 합니다. 이렇게 하면 목록 구조가 더 명확하게 표현됩니다. - 중첩 목록: YAML 목록은
groceries:
과 같이 중첩이 가능합니다. 이를 통해 계층 구조를 가진 목록을 쉽게 작성할 수 있으며, 들여쓰기를 사용하여 서브 목록을 추가할 수 있습니다. - 복합 데이터 유형: YAML 목록은
mixed_data_list:
와 같이 다양한 데이터 유형을 포함할 수 있습니다. 예를 들어 문자열, 숫자, 불리언 값뿐만 아니라 사전dictionary또는 다른 목록list 등 복합 데이터 유형을 포함할 수 있습니다.
사전(Dictionary)
YAML에서 사전Dictionary은 키-값 쌍으로 구성된 데이터 구조로서, 매핑mapping이라고도 불립니다.
person:
name: John Doe
age: 25
city: New York
education:
high_school: Good High School
university: Best University
위의 예시에서 사전을 표현한 person
내부에 name
, age
, city
, 그리고 education
이라는 키(key)가 있는 것을 확인할 수 있습니다.
- 각 키에 대응하는 값(value)은 콜론(
:
)을 기준으로 오른쪽에 위치했습니다. - 또한, 한 단계 더 들어간
education
키에는 또 다른 사전이 중첩되어 있어 더 복잡한 데이터 구조를 보여줍니다. 들여쓰기는 사전의 계층 구조를 표현하는 데 사용됩니다.
스트링(String)
YAML에서 문자열은 큰따옴표(""
) 또는 작은따옴표(''
)를 사용하거나 따옴표 없이 작성할 수 있습니다. 큰 따옴표 사용시 공백 문자와 이스케이프 문자를 인식할 수 있습니다. 작은 따옴표를 사용하면 문자열을 원시 문자열로 작성할 수 있습니다.
simple_string: Hello, world!
double_quoted: "Hello, world! \nThis is a new line."
single_quoted: 'Hello, world! \nThis is not a new line.'
YAML 파일에서 문자열을 작성할 때 어떤 따옴표를 사용할지는 상황과 주어진 문자열에 따라 판단합니다. 이스케이프 문자를 염두에 두고 큰따옴표를 사용하거나, 원시 문자열을 사용하려면 작은따옴표를 사용하십시오. 이를 통해 YAML 문자열에 대한 처리 방식을 효과적으로 구분하고 제어할 수 있습니다.
- 따옴표 없이 입력: 기본적인 문자열에서는 따옴표 없이 작성 가능합니다. 이 경우 간단하고 직관적인 문자열 표현을 위한 방법입니다.
- 큰따옴표(
" "
) 사용: 큰따옴표로 문자열을 감싸면 이스케이프 문자가 유효하게 작동하며, 공백 문자와 개행 등의 제어 문자를 처리할 수 있습니다. 예를 들어,\n
은 개행(newline)으로 인식되고 처리되며, 여러 공백 문자와 제어 문자도 유효하게 작동합니다. - 작은따옴표(
' '
) 사용: 작은따옴표로 문자열을 감싸면 원시 문자열(raw string)을 작성할 수 있습니다. 이 경우 이스케이프 문자는 일반 문자로 처리되며, 제어 문자의 동작이 무시됩니다.
멀티라인 문자열
YAML에서 멀티라인 문자열을 작성할 때는 >
또는 |
를 사용합니다.
folded_multiline: >
This is a folded
multiline string.
All newlines are removed.
literal_multiline: |
This is a literal
multiline string.
All newlines are preserved.
>
를 사용하면 개행 문자를 무시하고 문자열을 한 줄로 표시합니다. |
는 문자열에 개행 문자를 유지합니다.
- 접기 지시자 사용:
>
기호를 사용하여 멀티라인 문자열을 작성하면, 개행 문자는 무시되고 문자열이 접혀 한 줄로 표시됩니다. 연속된 개행 문자는 하나의 개행 문자로 처리되어 단락을 구분할 수 있습니다. - 리터럴 지시자 사용:
|
기호를 사용하여 멀티라인 문자열을 작성하면, 개행 문자가 문자열 내에 유지됩니다. 이를 통해 원래 문자열의 줄바꿈 구조를 그대로 보존할 수 있습니다.
주석
주석은 코드의 가독성과 이해를 높이는 데 도움을 주는 유용한 도구입니다. 주석을 활용하여 데이터의 의도를 명확하게 설명하고, 다른 사람들과 코드를 공유할 때 추가적인 정보를 제공할 수 있습니다. YAML에서 주석은 옥타샵(#
) 기호로 시작합니다.
# This is an example of a standalone comment
person:
name: John Doe # This is an inline comment
age: 25
주석은 독립된 줄에 작성하거나 데이터의 뒤쪽에도 추가할 수 있습니다.
- 독립된 주석: 주석이 별도의 줄에 작성됩니다. 주석 기호(
#
) 이후에 나오는 모든 내용은 주석으로 처리됩니다. 이러한 주석은 데이터 구조와 독립적으로 사용되며, 해당 줄의 데이터와는 직접적인 연관이 없습니다. 다른 사람이 코드를 이해하거나 유지보수하는 데 도움을 주는 역할을 합니다. - 인라인 주석: 주석이 데이터 구조 내의 특정 위치에 인라인으로 작성됩니다. 인라인 주석은 데이터 구조와 함께 사용되며, 해당 줄의 데이터와 관련된 설명을 제공합니다.
앵커 및 별칭 사용
YAML에서 앵커(&
)와 별칭(*
)을 사용하여 중복되는 구조를 재사용할 수 있습니다. 앵커를 사용해 구조에 이름을 지정하고, 별칭을 사용해 해당 구조를 참조합니다.
person: &person_anchor
name: John Doe
age: 25
employee:
<<: *person_anchor
position: Developer
위의 예시에서 앵커와 별칭을 사용해 person
과 employee
의 구조가 동일하게 유지되는 것을 볼 수 있습니다. 이는 중복을 피하고 데이터를 재사용할 수 있어 유지보수성을 향상시키는 데 도움이 됩니다.
person
은 앵커&person_anchor
를 가지는 맵입니다. 이 맵은name
과age
라는 키-값 쌍으로 구성되어 있습니다.employee
는 별칭*person_anchor
를 사용하여person
의 데이터를 참조합니다. 이를 통해employee
의 데이터는person
과 동일한 구조를 가지게 됩니다. 또한position
이라는 추가적인 키-값 쌍을 가질 수 있습니다.
확장자
YAML 파일은 일반적으로 .yaml
또는 .yml
확장자를 가지는 텍스트 파일로 저장됩니다. 이러한 확장자는 YAML 포맷을 나타내고 해당 파일이 YAML 문법을 따른 데이터를 포함하고 있음을 나타냅니다.
- 확장자
.yaml
과.yml
은 기능적으로 동일하며, YAML 파일을 구분하고 인식하는 데 사용됩니다. 어느 확장자를 선택하더라도 YAML 파일을 읽고 쓸 수 있습니다. 두 확장자는 기능상 동일하며, 프로젝트 또는 개발자의 선호에 따라 선택할 수 있습니다. 파일 확장자와 관계없이 파일 내용은 동일한 YAML 구문을 따릅니다. - 예를 들어, 서버 설정, 데이터 교환, 프레임워크 설정 등을 YAML 파일로 저장한다면,
config.yaml
또는settings.yml
와 같은 파일명으로 사용할 수 있습니다. 그러나 이러한 확장자는 일반적인 관례이지 강제적인 규칙은 아닙니다. 파일명과 확장자는 개발자의 선호도나 팀의 규칙에 따라 다를 수 있습니다. - YAML 파일은 구조적인 데이터를 표현하기 위해 사용되며, 키-값 쌍, 리스트, 맵 등의 요소를 활용하여 계층적인 구조를 표현하는 것으로 확장자는 단지 해당 파일이 YAML 포맷을 따르고 있는지를 나타내는 용도로 사용됩니다.
사용 팁
YAML 파일을 작성할 때 몇 가지 사용 팁을 따르면 가독성을 높이고 효율적인 구조를 구성할 수 있습니다.
가독성 높이기
- 적절한 들여쓰기: 들여쓰기는 계층 구조를 나타내는 데 중요합니다. 일관된 들여쓰기 규칙을 사용해 코드를 깔끔하게 유지합니다.
- 데이터 유형에 맞는 따옴표 사용: 문자열을 입력할 때 원시 문자열을 유지해야 할 경우 작은따옴표(
''
)를 사용하고, 이스케이프 문자 등의 특수 문자를 인식해야 할 경우 큰따옴표(""
)를 사용합니다. - 주석 사용: YAML 파일의 가독성을 높이려면 주석을 사용하여 구조, 데이터 또는 다른 중요한 부분을 설합니다. 이를 통해 동료 개발자나 코드를 처음보는 사람들이 이해하기 쉽게 도와줍니다.
효율적인 구조 구성
- 앵커 및 별칭 활용: 중복되는 데이터 구조가 있는 경우 앵커(
&
)와 별칭(*
)을 사용하여 중복을 피하고 코드를 간결하게 만듭니다. - 적절한 데이터 유형 사용: 사용 사례에 맞게 데이터 유형을 선택하여 구조 구성을 개선합니다 (예: 목록, 사전, 숫자 및 논리 값). 이렇게 하면 데이터를 탐색하고 사용하기 쉬워집니다.
- 복잡한 계층 구조 피하기: 가능하다면 단순한 계층 구조를 유지하여 코드를 관리하고 이해하기 쉽게 만드는 것이 좋습니다. 용도에 맞게 구조를 효과적으로 분리할 수 있으며, 이를 통해 유지 관리가 용이해집니다.
마치며
YAML 이란 무엇인지 yaml 파일의 기본적인 사용 방법에 대해서 알아보았습니다. 최근에는 노트앱의 기본 설정도 YAML 파일을 사용하는 경우도 어렵지 않게 경험할 수 있는데요. 이는 YAML 파일이 가독성이 좋고 사용자 친화적인 특성 때문입니다. 이로 인해 개발자뿐만 아니라 일반 사용자들도 설정 파일을 쉽게 작성하고 수정할 수 있게 되었습니다.
YAML의 발전으로 많은 소프트웨어와 도구들이 YAML 파일을 기본 설정으로 사용하기 시작했습니다. 이는 표준화와 확장성을 제공하며, 애플리케이션 간 데이터 교환을 편리하게 해줍니다. 결과적으로, YAML이 다양한 애플리케이션에서 설정 파일의 선호하는 포맷이 되었으며, 점차 다양한 분야에서 더 많이 사용될 것으로 예상됩니다.
따라서 앞으로 노트 앱, 텍스트 에디터, 개발 도구 등 다양한 애플리케이션에서 YAML 파일로 설정을 관리하고 변경하는 경험이 더 많아질 것으로 기대할 수 있습니다. 가독성과 편의성을 바탕으로 더 많은 사용자들이 YAML 형식의 설정 파일에 접근할 수 있다는 것은 직접 설정을 변경하며 애플리케이션을 자신의 환경에 맞춰 사용하는 데 큰 도움이 됩니다.