tracks
수년간 수많은 구성 파일을 다루면서, 단순성과 가독성 측면에서 YAML만큼 돋보이는 포맷은 드물었습니다. Kubernetes에서 워크플로를 설정하든, Docker에서 서비스를 정의하든, API 요청을 구조화하든 YAML은 복잡한 구성을 훨씬 다루기 쉽게 만들어 줍니다. 들여쓰기에 기반한 깔끔한 구조는 XML 같은 포맷의 군더더기를 없애면서도 유연성을 유지합니다.
이 가이드에서는 YAML의 문법, 구조, 고급 기능, 모범 사례를 차근차근 살펴보며 자신 있게 활용할 수 있도록 도와드립니다.
YAML이란?
YAML(Yet Another Markup Language / YAML Ain’t Markup Language)은 가독성과 사용 편의성을 최우선으로 하는 데이터 직렬화 형식입니다. HTML과 유사한 중첩 태그를 사용하는 XML이나 중괄호와 따옴표를 사용하는 JSON(파이썬 딕셔너리와 유사)과 달리, YAML은 더 간결하며 들여쓰기로 구조를 정의해 사람이 읽고 쓰기 쉽습니다.
YAML은 스칼라(문자열, 숫자, 불리언), 시퀀스(리스트), 매핑(키-값 쌍) 등 다양한 데이터 타입을 지원합니다. Kubernetes, Docker, Ansible 같은 도구에서 특히 구성 파일, 인프라 자동화, 데이터 교환에 널리 사용됩니다.
또한 YAML은 JSON의 상위 집합이므로, 유효한 JSON 파일은 YAML로 파싱할 수 있습니다. YAML 파일의 확장자는 보통 .yaml 또는 .yml입니다.
자세한 내용은 공식 웹사이트에서도 확인하실 수 있습니다!
YAML 문법과 구조
이 섹션에서는 키-값 쌍, 리스트, 중첩 데이터, 주석 등 YAML 문법의 기본 원리를 살펴봅니다.
기본 문법 규칙
YAML에는 몇 가지 기본 규칙이 있습니다.
- 공백 들여쓰기가 구조를 나타내므로 탭은 피하세요.
- 키-값 쌍은
key: value구조를 따릅니다. - 줄 시작에 하이픈을 사용하면 리스트를 나타냅니다.
#를 사용하면 주석 줄을 만들 수 있습니다.
# Here is an example of YAML
name: John Doe
age: 30
skills:
- Python
- YAML
키-값 쌍
YAML은 파이썬의 딕셔너리처럼 키-값 쌍으로 데이터를 표현합니다. 이는 여러 구성 파일과 설정에 정보를 전달하는 데 자주 쓰입니다. 문자열이나 키에 따옴표를 사용할 필요 없이, 필요한 키와 값을 그대로 작성하면 됩니다.
location: New York
country: USA
security-level: user
YAML의 리스트
리스트는 하이픈(-)으로 표현합니다. 하나의 키 아래 여러 객체를 나열할 수 있으며, 마크업 편집기에서 읽을 때 시각적으로 글머리표로 표시되는 경우가 많습니다.
fruits:
- Apple
- Banana
- Cherry
중첩 데이터
중첩 구조는 들여쓰기를 사용해 계층형 데이터 표현을 가능하게 합니다. 중첩된 딕셔너리를 떠올리면 됩니다. 들여쓰기를 통해 어떤 키가 다른 키의 하위 항목인지 표시합니다.
person:
name: Alice
details:
age: 25
city: London
주석
주석은 #로 시작하며 YAML 파서에서 무시됩니다. 이 주석은 한 줄 주석입니다.
# This is a comment
username: admin
password: secret
YAML의 고급 기능
YAML에는 문서의 효율성과 구조화를 높여 주는 여러 기능이 있습니다. 대표적으로 여러 줄 문자열, 데이터 타입, 앵커가 있으며, 이 섹션에서는 실용적인 예제와 함께 살펴봅니다.
여러 줄 문자열
YAML은 |(리터럴 블록) 또는 >(폴딩 블록)를 사용해 여러 줄 문자열을 지원합니다.
|리터럴 블록은 줄바꿈마다\n을 생성합니다.>폴딩 블록은 연속된 줄바꿈에 대해서만 새 줄을 만듭니다.
literal: |
This is a
multi-line string.
folded: >
This is another
multi-line string.
위 내용은 출력 결과를 보면 더 잘 이해할 수 있습니다.
|(리터럴 블록)의 경우:
This is a
multi-line string.
>(폴딩 블록)의 경우:
This is another multi-line string.
YAML의 데이터 타입
YAML은 문자열, 숫자, 불리언, null 값 등 다양한 데이터 타입을 지원합니다. 형식에 따라 타입을 자동으로 감지하지만, 명시적 타입 정의도 가능합니다.
다음 예제는 YAML에서 기본 데이터 타입을 사용하는 방법을 보여줍니다.
string_implicit: Hello, YAML! # No quotes needed unless necessary
string_double_quoted: "Supports escape sequences like \n and \t"
string_single_quoted: 'Raw text, no escape sequences'
integer: 42 # Whole numbers
float: 3.14 # Numbers with decimals
boolean_true: true
boolean_false: false
null_value: null # Null value
null_tilde: ~ # Another way to represent null
YAML은 필요할 때 !!type을 사용해 명시적 타입 선언을 허용합니다.
explicit_string: !!str 123 # Forces 123 to be a string
explicit_integer: !!int "42" # Forces "42" to be an integer
explicit_float: !!float "3.14" # Forces "3.14" to be a float
YAML은 구조화된 데이터에 자주 사용되므로 다음을 지원합니다.
- 리스트(시퀀스):
fruits:
- Apple
- Banana
- Cherry
- 딕셔너리(매핑):
person:
name: Alice
age: 30
is_student: false
앵커와 별칭
YAML에서는 앵커(&)로 재사용 가능한 값을 정의하고, 별칭(*)으로 참조할 수 있습니다. 이는 구성 파일의 중복을 줄여 더 깔끔하고 관리하기 쉽게 만들어 줍니다.
defaults: &default_settings
retries: 3
timeout: 30
server1:
host: example.com
retries: *default_settings # Reuses the retries value from defaults
<<: 구문을 사용하면 앵커에서 다른 매핑으로 키-값 쌍을 병합할 수 있습니다. 두 곳에 동일한 키가 있으면 새 값이 기존 값을 덮어씁니다.
defaults: &default_settings
retries: 3
timeout: 30
server1:
<<: *default_settings # Merges all key-value pairs from default_settings
host: example.com # This key is added to the merged data
최종적으로 해석된 구조는 다음과 같습니다.
server1:
retries: 3
timeout: 30
host: example.com
앵커와 별칭은 큰 구성 파일에서 반복 값을 수동으로 기입하는 비효율을 줄이는 데 특히 유용합니다. YAML 파일을 DRY(Don't Repeat Yourself)하게 유지하고 업데이트를 쉽게 해 줍니다.
YAML의 일반적인 활용 사례
YAML은 소프트웨어 개발, 인프라 자동화, API 관리에서 널리 사용됩니다. 사람이 읽기 쉬운 문법 덕분에 구성 파일, 데이터 직렬화, IaC(Infrastructure as Code) 포맷으로 선호됩니다. 가장 흔한 적용 분야를 살펴보겠습니다.
구성 파일
YAML은 Docker Compose, Kubernetes, 그리고 CI/CD 파이프라인 같은 애플리케이션의 구성에 널리 쓰입니다. 이해하기 쉬워서 Docker YAML 설정 파일을 접하는 누구나 어떤 일이 일어나는지 파악하기 수월합니다.
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
environment:
- NGINX_HOST=localhost
- NGINX_PORT=80
YAML의 가독성과 앵커/별칭 지원은 반복을 줄여 JSON이나 XML보다 유지보수가 쉬워집니다.
Docker에서 YAML을 사용하는 방법은 중급 Docker 코스에서 더 알아보세요.
데이터 직렬화와 전송
YAML은 복잡한 데이터 구조를 사람이 읽기 쉬운 형식으로 변환하면서 기계가 쉽게 파싱할 수 있도록 하여, API 및 구성 관리 도구에서 데이터 직렬화에 사용됩니다.
예를 들어, YAML 형식의 API 요청 본문은 다음과 같습니다.
user:
id: 123
name: "John Doe"
email: "johndoe@example.com"
active: true
YAML의 들여쓰기 기반 구조는 불필요한 문법을 없애 JSON에 비해 가볍고, 읽기 쉽고, 수정하기도 편합니다.
코드형 인프라(IaC)
Ansible과 Kubernetes 같은 구성 관리 도구는 YAML을 활용해 시스템 상태를 정의하고, 프로세스를 자동화하며, 환경 전반의 일관성을 보장합니다.
- Ansible에서는 플레이북을 YAML로 작성해 시스템 상태, 작업, 의존성을 정의하여 인프라 구성 요소가 일관되게 설정되도록 합니다.
- Kubernetes는 파드, 서비스, 디플로이먼트 같은 리소스를 정의하는 매니페스트에 YAML을 사용해 컨테이너화된 애플리케이션을 자동으로 오케스트레이션합니다.
다음은 Kubernetes 파드 구성의 예시입니다.
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app-container
image: my-app:latest
ports:
- containerPort: 8080
Kubernetes에서 YAML이 어떻게 사용되는지는 이 Introduction to Kubernetes 코스에서 알아보세요.
API 문서화
API 사양인 OpenAPI와 Swagger는 엔드포인트와 데이터 구조를 읽기 쉽게 정의하기 위해 YAML을 사용합니다. YAML은 API 메서드, 요청 파라미터, 응답 형식, 인증 방식을 개요화하는 데 쓰입니다.
다음은 YAML로 작성된 OpenAPI 사양의 예시입니다.
openapi: 3.0.0
info:
title: User API
version: "1.0"
paths:
/users:
get:
summary: Retrieve a list of users
responses:
"200":
description: Successful response
예를 들어 OpenAPI 사양은 RESTful API를 문서화하는 데 YAML을 사용합니다. 이를 통해 클라이언트 SDK 생성, 대화형 API 문서, 자동화된 테스트를 위한 명확한 청사진을 제공합니다. 이런 구조화된 형식은 API 구현 전반의 일관성을 보장합니다.
YAML 파일 다루기
YAML은 구성 파일, 자동화, 데이터 직렬화에 널리 사용되지만, 들여쓰기에 의존하기 때문에 올바른 포매팅이 중요합니다. YAML을 효과적으로 읽고, 작성하고, 검증하고, 편집하는 방법을 살펴보겠습니다.
Python에서 YAML 읽기/쓰기
Python의 PyYAML 라이브러리는 YAML을 파싱하고 생성할 수 있습니다.
다음과 같은 구성 YAML 파일이 있다고 가정해 보겠습니다.
database:
host: localhost
port: 5432
user: admin
password: secret
Python에서 구성 파일을 다루는 방법은 다음과 같습니다.
import yaml
# Load YAML data
with open("config.yaml", "r") as file:
data = yaml.safe_load(file) # safe_load prevents arbitrary code execution
# Modify data (optional)
data["database"]["user"] = "new_user"
# Write YAML data
with open("output.yaml", "w") as file:
yaml.dump(data, file, default_flow_style=False)
Python에서 JSON 데이터를 다루는 방법이 궁금하다면, 종합 Python JSON 튜토리얼을 확인해 보세요.
YAML 파일 검증
올바른 구조를 보장하려면, 공백 대신 탭 사용 여부나 중복 문자, 문법 문제, 트레일링 스페이스 같은 이상을 확인하는 도구를 사용할 수 있습니다.
다음은 널리 사용되는 YAML 검증 도구입니다.
- CLI 도구: yamllint(Python 기반 린터)
- 온라인 검증기: YAML Lint, JSON Formatter의 YAML Validator
YAML 편집
YAML은 어떤 텍스트 편집기에서도 작성하고 편집할 수 있지만, 린팅 도구와 문법 하이라이팅을 사용하면 가독성이 향상됩니다.
제가 즐겨 사용하는 편집기는 다음과 같습니다.
- VS Code(YAML 플러그인 포함)
- PyCharm(내장 지원)
- Sublime Text(YAML 문법 하이라이팅)
YAML에서 피해야 할 흔한 실수
단순한 포맷이지만 YAML을 사용할 때에도 오류와 오타가 생기기 쉽습니다. 이 섹션에서는 이러한 실수를 다루고, 깔끔하고 올바른 파일을 작성하기 위한 모범 사례를 제공합니다. 린터나 텍스트 편집기 사용을 권장하는 이유이기도 합니다!
탭과 공백 혼용
YAML의 들여쓰기는 공백에 의존하므로, 절대 공백과 탭을 섞어 쓰지 마세요. 탭은 YAML 스크립트를 망가뜨립니다. 이는 의도적인 결정으로, 시스템마다 탭을 해석하는 방식이 다르기 때문에 영향을 최소화하기 위해 공백 사용을 권장합니다.
잘못된 들여쓰기
파싱 오류를 피하려면 들여쓰기를 일관되게 유지하세요. 들여쓰기는 YAML에서 계층을 나타내는 유일한 방법이므로, 잘못 파싱되면 코드에 문제가 생길 수 있습니다. key: value 쌍을 엉뚱한 위치에 들여넣기 쉬우므로, 들여쓰기에 특히 유의하세요!
특수문자에 따옴표 누락
특수문자나 공백이 포함된 문자열에는 따옴표를 사용하세요. 백슬래시, 쉼표, 느낌표 등은 문자열로 인식되도록 따옴표가 필요합니다.
path: "/home/user/documents"
message: "Hello, World!"
적절한 검증, 구조화된 편집, Python의 PyYAML을 활용하면, 흔한 함정을 피하면서 YAML 파일을 효율적으로 다룰 수 있습니다.
마무리
YAML은 구성, 데이터 직렬화, 인프라 자동화에 널리 사용되는 강력하면서도 단순한 포맷입니다. 문법, 구조, 모범 사례를 이해하면 다양한 애플리케이션에서 YAML을 효율적으로 활용할 수 있습니다.
실무에서 YAML을 적용해 보고 싶다면 다음을 참고하세요.
- CI/CD for Machine Learning 코스에서 CI/CD 워크플로에 YAML이 어떻게 쓰이는지 알아보세요.
- Introduction to APIs in Python 코스에서 API 사양에 YAML이 어떻게 활용되는지 살펴보세요.
- Containerization and Virtualization 트랙에서 컨테이너화와 인프라 자동화를 더 깊이 탐구하세요.
FAQs
YAML은 범용인가요?
데이터 소스나 대상이 YAML을 읽을 수 있다면, YAML은 데이터를 직렬화하고 전송하는 데 유효하고 유용한 방법입니다. YAML을 처리할 수 있는 대상으로 데이터를 보내는지 확인하세요.
YAML은 안전한가요? YAML 파일이 보안 위험을 초래할 수 있나요?
YAML 자체는 단지 데이터 형식이지만, 신뢰할 수 없는 YAML 파일을 파싱할 때 보안 위험이 발생할 수 있습니다. Python의 PyYAML에서 기본 yaml.load() 메서드는 YAML에 포함된 임의 코드를 실행할 수 있어 위험합니다. 대신 의도치 않은 악성 코드 실행을 방지하기 위해 항상 yaml.safe_load()를 사용하세요. 마찬가지로 애플리케이션에서 YAML을 사용할 때는 보안 취약점을 피하기 위해 엄격한 스키마 검증을 수행해야 합니다.
YAML에서 환경 변수를 지원하나요?
네! YAML 자체가 환경 변수를 직접 처리하지는 않지만, 많은 도구(Docker Compose와 Kubernetes 등)에서 YAML 파일 내에서 환경 변수를 참조할 수 있습니다.
YAML에서 주석은 어떻게 다루나요?
YAML은 # 기호로 한 줄 주석을 지원하지만, 여러 줄 주석은 지원하지 않습니다. 여러 줄 주석이 필요하다면 _comment 같은 더미 키를 사용하는 우회 방법이 있습니다. 하지만 이는 단지 관례일 뿐이며, 애플리케이션에서 특별히 필터링하지 않는 한 YAML 파서가 무시하지 않습니다.