YAML์€ ๋ฌด์—‡์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ํ˜•์‹์€ YAML( Yet Another Markup Language ; ๋‚˜์ค‘์— YAML Ai't Markup Language )์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ์ „์†ก์„ ์œ„ํ•ด ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(XML ๋ฐ JSON์ด ์ด ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ). ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Docker, Kubernetes, Ansible ๋“ฑ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. YAML์„ ํŒŒ์ผ(์˜ˆ: ๊ตฌ์„ฑ ํŒŒ์ผ)์— ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ์ž: .yaml ๋˜๋Š” .yml.

์–ธ์–ด ๊ตฌ๋ฌธ

XML์—์„œ ๊บพ์‡  ๊ด„ํ˜ธ( <> )๋Š” ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. JSON์—์„œ๋Š” ์ค‘๊ด„ํ˜ธ( {} )๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. YAML์€ ์ƒˆ ์ค„๊ณผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋Š” ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ €์žฅ๋˜๋ฉฐ ์—ฌ๊ธฐ์„œ ํ‚ค๋Š” ๋ฌธ์ž์—ด์ด๊ณ  ๊ฐ’์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•(๋ฌธ์ž์—ด, ์ˆซ์ž, ์ฐธ/๊ฑฐ์ง“, ๋ฐฐ์—ด ๋“ฑ)์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋”ฐ์˜ดํ‘œ ์—†์ด ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ •๋ณด๊ฐ€ YAML์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์ž๋ฐ” YAML
์ •์ˆ˜

int number = 5
๋ฒˆํ˜ธ: 5
๋ถ„์ˆ˜

double number = 4.3
๋ฒˆํ˜ธ: 4.3
๋ถ€์šธ ๋ณ€์ˆ˜

boolean valid = false
์œ ํšจ: ๊ฑฐ์ง“
์œ ํšจ: ์•„๋‹ˆ์š”
์œ ํšจ: ๊บผ์ง

* ์œ ํšจํ•œ ๋ถ€์šธ ๊ฐ’: ์ฐธ/๊ฑฐ์ง“, ์˜ˆ/์•„๋‹ˆ์˜ค, ์ผœ๊ธฐ/๋„๊ธฐ.

๋ˆ

String city = "New York"
๋„์‹œ: ๋‰ด์š•
์‹œ: '๋‰ด์š•'
๋„์‹œ: "๋‰ด์š•"

* ์„ธ ๊ฐ€์ง€ ์˜ต์…˜ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด

String line = "aaa\nbbb"
์ค„: "aaa\nbbb"
์ฝ”๋“œ์˜ ์ฃผ์„

// comment
# ๋…ผํ‰
๋ฌผ์ฒด

public class Person {
  String name = "Dennis";
  int age = 32;
}

* ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ:
  ์ด๋ฆ„: "๋ฐ๋‹ˆ์Šค"
  ๋‚˜์ด: 32

* ์†์„ฑ ์•ž ๋“ค์—ฌ์“ฐ๊ธฐ์— ์ฃผ์˜ํ•˜์„ธ์š”. ๋ชจ๋“  ์†์„ฑ์— ๋Œ€ํ•ด ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœ ๊ฐ’ ๋ชฉ๋ก

var ages = 
    List.of(1, 3, 5, 9, 78, -5);
๋‚˜์ด: [1, 3,5,9,78, -5]
๋‚˜์ด:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5

* ๋‘ ์˜ต์…˜ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
** ๋ชฉ๋ก์˜ ๊ฐ ์š”์†Œ๋Š” ํ•˜์ดํ”ˆ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์ฒด ๋ชฉ๋ก

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
โ€ฆ
List<Person> people = List.of(
        new Person("Ian", 21),     
        new Person("Marina", 25),     
        new Person("Owen", 73)      );
์‚ฌ๋žŒ๋“ค:
  - ์ด๋ฆ„: "Ian"
    ๋‚˜์ด: 21
  - ์ด๋ฆ„: "Marina"
    ๋‚˜์ด: 25
  - ์ด๋ฆ„: "Owen"
    ๋‚˜์ด: 73

Java์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชฉ๋ก์˜ ์š”์†Œ๋Š” ๋ชฉ๋ก์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋Š” ์„œ๋กœ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜์ดํ”ˆ์€ ์ƒ์œ„ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ˆ˜ํ‰์œผ๋กœ ์˜คํ”„์…‹๋˜๊ฑฐ๋‚˜ ๋ฐ”๋กœ ์•„๋ž˜์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ชจ๋“  ์š”์†Œ์˜ ํ˜•์‹์ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜ผ๋ž€๊ณผ ๋ชจํ˜ธํ•œ ์ค‘์ฒฉ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์—ฐ๋ น:
  - 1
  - 3
  - 5
  - 9
  - 78
  - -5
์—ฐ๋ น:
- 1
- 3
- 5
- 9
- 78
- -5

ํ…์ŠคํŠธ ๊ฐ’์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ๋‰˜์•™์Šค๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    multilineText: "๋ผ์ธ 1\n๋ผ์ธ 2\n....๋ผ์ธ n"

    ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆ์พŒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ | (ํŒŒ์ดํ”„) ๊ธฐํ˜ธ: ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ: |
     ๋ผ์ธ 1
     ๋ผ์ธ 2
     ....
     ๋ผ์ธ n

    ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋” ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹œ๊ฒ ์ฃ ?

  2. ๊ธด ์ค„. ํ…์ŠคํŠธ๋ฅผ ํ•œ ์ค„์— ์œ ์ง€ํ•˜๋ฉด์„œ IDE์˜ ๋ณด์ด๋Š” ์ž‘์—… ๊ณต๊ฐ„์—๋„ ๋งž์ถ”๋ ค๋ฉด > (๋ณด๋‹ค ํผ) ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    singlelineText: >
     ์‹œ์ž‘
     ...
     ๊ฐ™์€ ์ค„ ๊ณ„์†
     ...
     ์ข…๋ฃŒ

    ๋ชจ๋“  ํ…์ŠคํŠธ๋Š” ํ•œ ์ค„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ YAML ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ --- (ํ•˜์ดํ”ˆ 3๊ฐœ) ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

YAML ๋ฌธ์„œ์˜ ์˜ˆ

Java ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(ํด๋ž˜์Šค)์™€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ YAML๋กœ ํ‘œํ˜„ํ•ด ๋ด…์‹œ๋‹ค.


class Family {
   private Date weddingDate;
   private Person wife;
   private Person husband;
   private List<Person> children;

   // Getters and setters are omitted
}

class Person {
   private final String name;
   private final boolean isWoman;
   private int age;

   public Person(String name, int age, boolean isWoman) {
       this.name = name;
       this.age = age;
       this.isWoman = isWoman;
   }

// Getters and setters are omitted

}

public static void main(String[] args) {
   Person wife = new Person("Ann", 37, true);
   Person husband = new Person("Alex", 40, false);
   var children = List.of(
           new Person("Iris", 12, true),
           new Person("Olivia", 5, true)
   );
   Date weddingDate = new Date(/* some long */);

   Family family = new Family();
   family.setWeddingDate(weddingDate);
   family.setWife(wife);
   family.setHusband(husband);
   family.setChildren(children);
}

YAML์˜ ์œ ํšจํ•œ ํ‘œํ˜„:

---
weddingDate: 2000-12-03
์•„๋‚ด:
 ์ด๋ฆ„: Ann
 ๋‚˜์ด: 37
 isWoman: ์˜ˆ
๋‚จํŽธ:
 ์ด๋ฆ„: Alex
 ๋‚˜์ด: 40
 isWoman:
์ž๋…€ ์—†์Œ:
 - ์ด๋ฆ„: Iris
   ๋‚˜์ด: 12
   isWoman: true
 - ์ด๋ฆ„: Olivia
   ๋‚˜์ด: 5
   isWoman: ์‚ฌ์‹ค
---