YAML (야멜)

YongJin·2024년 6월 29일

YAML? 뜻이 뭐고 어디에 사용되는 건지?

YAML은 데이터를 저장하고 전달하기 위한 형식이다. 웹사이트의 설정 파일, 애플리케이션의 설정, 서버 구성 등 IT 분야에서 매우 다양하게 사용된다. YAML의 가장 큰 특징은 그 가독성에 있다. 사람이 읽기 쉽도록 설계되어 있다.
파일로 작성시 확장자는 .yaml 혹은 .yml 확장자를 가진다.

[ .yaml 과 .yml 차이점 ]결론부터 말하자면 yaml과 yml파일 확장자는 모두 해석 및 구문이 동일하다. 즉, 어떤식으로 파일확장자를 짓든 똑같은 것이다.이렇게 분리된 이유는, FAT32시스템의 파일확장자가 3자로 제한되는 특성이 있었기 때문이다.그래서 예전에는 .html 대신 .htm 으로도 쓰였는데 이와 같은 원리이다. 하지만 요즘은 확장자에 3글자를 넣어야 하는 OS 시스템 수준의 시행이 없으니, 그냥 단순하게 .yaml을 사용하자.

(출처: https://inpa.tistory.com/entry/YAML-📚-yaml-개념-문법-이해하기-💯-총정리 [Inpa Dev 👨‍💻:티스토리])

  • 탄생배경

우리가 타 시스템 간에 데이터를 주고 받을 필요가 있을때 데이터의 연동과 호환성을 위해 포맷에 대한 규칙이 필요하게 된다.
이때까지 자주 사용해왔던 CSV, XML, JSON, Properties 등이 바로 그것이다.
기존에는 웹에서는 XML과 JSON으로 그리고 자바 프로젝트에서는 properties 파일을 이용하여 어떤 값들을 정의하고 저장하고 사용해왔다.
XML은 사용하기 까다롭고 가독성도 좋지 않기 때문에 요즘 들어 JSON 포매팅 방식으로 많이 이용되는 편이지만, JSON 역시 주석을 달수 없는 등 약간의 제한이 있고 중괄호와 대괄호의 남발로 코드 길이가 강제적으로 길어지게 된다는 단점이 있다.
이러한 사용하기가 복잡하다는 점 때문에 2001년에 Clark Evans에 의해 최초 제안된 새로운 포매팅 방식이 YAML / YML 이다.

  • 설계상 치명적인 단점
    대표적인 문제
    Norwat problem (가독성을 좋게 한다고 생긴 문제 > 노르웨이 국가코드가 yaml문법으로 불리언 false로 처리된다)
    YAML의 이런 문제들로 인해 최신 유행은 TOML이다 (Gradle의 버전 카테고리에서 쓰임)

  • Json이 계속해서 쓰이는 이유

  1. 기존 웹 서비스들이 Json을 사용중 + 웹 브라우저에서 기본적으로 제공하는 것이 XML과 JSON
  2. 기계끼리 통신시에는 Json이 딱히 문제 될 것이 없음 (YAML과 TOML 은 사람이 수정할 일이 있을 때 사용)
  • 주요특징

YAML과 Json 비교


두 번째 코드 이미지는 쿠버네티스에서 파드를 실행하는 코드이다. JSON의 경우에는 괄호가 계층을 나타내기 때문에 코드가 더 길어지며, 불필요한 시각정보(괄호, 따옴표, 콤마 등)로 인해 눈이 쉽게 피로해질 수 있다.

가장 큰 차이는 JSON은 괄호 사용 YAML은 공백 사용, YAML 은 (,) 표기 없이 사용함
Yaml은 주석도 사용가능하다
YAML 은 Docker compose 나 Spring 설정에 많이 사용된다.

사용법 (문법)

  • 주석: # 기호를 사용하여 주석을 추가할 수 있다.

  • 기본 구조: YAML은 들여쓰기를 사용하여 데이터의 계층 구조를 나타낸다. 탭 대신 공백을 사용하며, 일반적으로 2개 또는 4개의 공백을 사용한다. 그리고 , 를 사용하지 않는다.
    YAML 파일은 키와 값의 쌍으로 구성돤다. 예를 들어, key: value 형태로 표현한다. (이 때 반드시 : 뒤에 공백을 넣어줘야 한다!)

owner:
   name: 로봇왕
   age: 44
   major: 제어공학과
  • 따옴표 : YAML은 기본적으로 따옴표를 사용하지 않지만, 값에 : 가 들어가야 하는 경우 따옴표를 씌워줘야 한다
name: Mark
address1: San Francisco
address2: "San Hoje"
address3: 'Los Angeles'
ratio1: "1:2"
ratio2: '1:2'
ratio3: 1:2 # 제대로 인식 안됨
  • 리스트: 하이픈(-)을 사용하여 리스트를 표현한다.
hobbies:
  - Reading
  - Hiking
  - Coding
  • 객체 배열 : 일반 배열 하이픈(-)과 무슨차이가 있냐면, 하이픈(-) 뒤에 key: value 구조가 온다면 이것은 객체를 포함한 배열, 그냥 데이터가 바로 온다면 단순 원소 배열이라고 인식하면 된다.
#YAML 밑에는 JSON (같은 의미의 둘을 비교)
students:
  - name: Mark
    major: Math
    age: 20
  - name: Julie
    major: Arts
    age: 23
  - name: Tommy
    major: Music
    age: 25
   ------------------- 
    {
  "students": [
    {
      "name": "Mark",
      "major": "Math",
      "age": 20
    },
    {
      "name": "Julie",
      "major": "Arts",
      "age": 23
    },
    {
      "name": "Tommy",
      "major": "Music",
      "age": 25
    }
  ]
}
  • 스칼라 타입: 문자열, 숫자, 불리언 등의 기본 데이터 타입을 지원한다. (YAML의 스칼라 타입이 문자열 숫자 불리언이다. / age: 30은 정수 스칼라, 재밌는 점은 불리언에 기본적인 true, false는 물론이고 yes 와 no 도 있다)
booleans:
   - yes
   - Yes
   - YES
   - true
   - True
   - FALSE
   - "YES" # 따옴표를 쓴 경우 문자열로 인식된다.
   - "NO" # 따옴표를 쓴 경우 문자열로 인식된다.
  • 멀티라인 문자열: 파이프(|) 또는 꺾쇠(>)를 사용하여 여러 줄에 걸친 문자열을 표현할 수 있다.

  • ">" 기호는 입력 시의 개행(엔터) 문자를 공백(스페이스)으로 치환해준다. 단 빈줄 하나가 (엔터 하나가) 단독으로 있는 경우에는 줄 바꿈으로 바꿔준다. 맨 끝의 줄바꿈 문자도 포함한다

  • ">-" 으로 사용시에는 맨 끝에 줄바꿈 문자를 포함시키지 읺는다

# 중간에 엔터문자가 있다
# 끝에도 엔터문자가 있다     
paragraph1: >
  abc
  def
  ghi

  aab
  ccc
paragraph2: >- # 맨끝의 줄바꿈 문자를 포함시키지 않는다.
  abc
  def
  ghi

  aab
  ccc

------- 이걸 JSON으로 바꾸면
 {
  "paragraph1": "abc def ghi\naab ccc\n",
  "paragraph2": "abc def ghi\naab ccc"
}
  • "|" 기호는 입력 시의 개행(엔터) 문자 그대로 줄을 바꿔준다.
  • "|-" 기호는  맨끝의 줄바꿈 문자를 포함시키지 않는다.
# 그대로 줄바꿈 + 맨끝 개행문자 포함
paragraph3: |
  abc
  def
  ghi

  aab
  ccc

# 그대로 줄바꿈 + 맨끝 개행문자 제외
paragraph4: |-
  abc
  def
  ghi

  aab
  ccc
  
  ------- 이걸 JSON으로 바꾸면
  
  {
  "paragraph3": "abc\ndef\nghi\n\naab\nccc\n",
  "paragraph4": "abc\ndef\nghi\n\naab\nccc"
}
  • 변수 기능 제공 ( 앵커와 별칭: &로 앵커를 정의하고 *로 별칭을 사용하여 반복되는 값을 재사용할 수 있다. )
default: &default_school # default_school 라는 변수를 선언하고, 그 내용은 group 과 description 데이터를 지니고 있다 앵커와 별의 위치를 잘 확인하자!
   group: '서울대학교'
   description: |
      서울에 위치하는 대한민국 대학교!

student:
   - name: '홍길동'
     <<: *default_school # default_school 변수 내용물을 대입한다
   - name: '임꺽정'
     <<: *default_school # default_school 변수 내용물을 대입한다

사용 사례

YAML은 다양한 소프트웨어 프로젝트에서 구성 관리, 데이터 교환, 자동화 등에 사용된다. 예를 들어, Kubernetes에서는 YAML을 사용하여 컨테이너화된 애플리케이션의 배포 및 관리를 위한 매니페스트 파일을 작성한다.

Spring에서의 사용 사례

Spring에서의 YAML 사용: Spring Boot에서는 application.yml 또는 application.yaml 파일을 사용하여 애플리케이션의 구성을 정의할 수 있다. 이를 통해 다양한 환경에 대한 프로파일을 설정하고, 각 환경에 맞는 구성을 적용할 수 있다. 예를 들어, 개발 환경과 운영 환경에서 다른 데이터베이스 설정을 사용하거나, 특정 프로파일에 따라 로깅 레벨을 조정하는 등의 작업을 할 수 있다.
(예시)

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password: password

이 파일은 개발 환경에서 사용할 데이터베이스 설정을 정의하고 있다. 스프링은 이 파일을 읽어서 DataSource라는 DB 설정에 관련한 클래스를 만들어 낸다.

기존 과제에서 설정해 놓았던 application.properties를 application.yml로 옮기는 작업을 진행했다

기존에 application.properties에 image와 logging level에 대해서는 application.properties에 두었는데 모두 옮겼다

  • application.properties에 있던 내용들
spring.application.name : ~ 
image.file.path: ~ 
logging.level.root: ~
  • application.yml로 옮가고 난 후 (들여쓰기로 계층의 구조롤 나타낸다는 것을 확인하자!)
image :
  file : ~
    path : ~

logging:
  level : 
    root: INFO
spring:
  datasource:
    url : jdbc:mariadb://localhost:3306/restapi
    username : 
    password : 
    driver-class-name: org.mariadb.jdbc.Driver
  application:
    name : SpringRestApi

코드 예시 및 출처 : 출처: https://inpa.tistory.com/entry/YAML-📚-yaml-개념-문법-이해하기-💯-총정리 [Inpa Dev 👨‍💻:티스토리]

https://teddylee777.github.io/python/yaml/#%EB%93%A4%EC%97%AC%EC%93%B0%EA%B8%B0%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B3%84%EC%B8%B5-%EA%B5%AC%EC%A1%B0

profile
더 나은 사람이 되고 싶습니다

0개의 댓글