# YAML 빠른 참조

*스칼라, 시퀀스, 매핑, 앵커, 멀티라인*

> Source: YAML Specification (yaml.org) · MIT

## 구문

### 기본 규칙

| Command | Description |
|---------|-------------|
| `Indentation` | 공백만 사용 (탭 없음), 일관된 깊이 |
| `#` | 주석 (줄 끝까지) |
| `---` | 문서 시작 마커 |
| `...` | 문서 끝 마커 |
| `Case sensitive` | 키와 값은 대소문자 구분 |

### 최소 예제

```
---
name: Alice
age: 30
active: true
```

## 스칼라

### 스칼라 타입

| Command | Description |
|---------|-------------|
| `hello` | 문자열 (따옴표 없음) |
| `"hello"` | 문자열 (큰따옴표, 이스케이프 허용) |
| `'hello'` | 문자열 (작은따옴표, 리터럴) |
| `42 / 3.14` | 숫자 (정수 / 부동소수점) |
| `true / false` | 불리언 |
| `null / ~` | null 값 |
| `2026-03-26` | 날짜 (ISO 8601) |

### 따옴표 규칙

```
plain: no quotes needed
special: "colon: and hash # need quotes"
escape: "line\nnewline"
literal: 'no \n escaping here'
```

## 시퀀스

### 블록 시퀀스

```
fruits:
  - apple
  - banana
  - cherry
```

### 플로우 시퀀스 (인라인)

```
colors: [red, green, blue]
matrix: [[1, 2], [3, 4]]
```

### 객체의 시퀀스

```
users:
  - name: Alice
    role: admin
  - name: Bob
    role: user
```

## 매핑

### 블록 매핑

```
server:
  host: localhost
  port: 8080
  debug: false
```

### 플로우 매핑 (인라인)

```
point: {x: 10, y: 20}
```

### 복합 키

```
? [first, second]
: "compound key value"
```

## 앵커 및 앨리어스

### 정의 및 재사용

```
defaults: &defaults
  timeout: 30
  retries: 3
production:
  <<: *defaults
  timeout: 60
```

### 참조

| Command | Description |
|---------|-------------|
| `&name` | 앵커 정의 |
| `*name` | 앵커 참조 (앨리어스) |
| `<<` | 머지 키 — 현재에 매핑 병합 |

## 멀티라인 문자열

### 블록 스칼라

| Command | Description |
|---------|-------------|
| `\| (literal)` | 줄바꿈을 그대로 보존 |
| `> (folded)` | 줄바꿈을 공백으로 접음 |
| `\|+ (keep)` | 리터럴, 끝 줄바꿈 유지 |
| `\|- (strip)` | 리터럴, 끝 줄바꿈 제거 |
| `>- (fold+strip)` | 접기, 끝 줄바꿈 제거 |

### 리터럴 블록

```
script: |
  echo "line one"
  echo "line two"
```

### 접기 블록

```
description: >
  This long text will be
  folded into a single line
  with spaces.
```

## 태그

### 타입 태그

| Command | Description |
|---------|-------------|
| `!!str 42` | 값을 문자열 "42"로 강제 |
| `!!int "42"` | 값을 정수 42로 강제 |
| `!!float 1` | 값을 부동소수점 1.0으로 강제 |
| `!!bool "true"` | 값을 불리언으로 강제 |
| `!!null ""` | 값을 null로 강제 |
| `!!binary` | Base64 인코딩된 바이너리 데이터 |

### 태그 예제

```
port: !!str 8080
enabled: !!bool "yes"
version: !!float 3
```

## 자주 쓰는 패턴

### Docker Compose

```
services:
  web:
    image: nginx:alpine
    ports: ["80:80"]
    environment:
      NODE_ENV: production
```

### GitHub Actions

```
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
```

### 팁

| Command | Description |
|---------|-------------|
| `yamllint` | 구문 및 스타일 린팅 |
| `yq` | 커맨드라인 YAML 프로세서 (jq와 유사) |
| `Avoid Norway` | NO는 불리언 false — 국가 코드는 따옴표로 묶기 |
| `Avoid !!python` | 신뢰할 수 없는 YAML을 안전하지 않은 로더로 로드하지 말 것 |
