본문 바로가기
IT개념

[IT개념] yaml(YAML Ain't Markup Language), JSON

by JDonly 2024. 8. 13.

개념

YAML(YAML Ain't Markup Language)은 사람이 읽기 쉽고 쓰기 쉬운 데이터 직렬화 형식입니다.
YAML은 주로 구성 파일과 데이터 저장을 위해 사용되며, Python, Ruby, Perl, Java, JavaScript 등 다양한 프로그래밍 언어와 호환됩니다.

특징

  1. 가독성: YAML은 들여쓰기와 공백을 사용하여 구조를 표현하므로, 사람이 읽고 쓰기 쉽게 설계되었습니다.
  2. 데이터 구조 표현: 리스트, 맵, 스칼라와 같은 복잡한 데이터 구조를 표현할 수 있습니다.
  3. 플랫폼 독립적: 다양한 프로그래밍 언어와 환경에서 쉽게 사용할 수 있습니다.
  4. 단순함: XML이나 JSON에 비해 구문이 간단하고, 불필요한 문법 요소가 적습니다.

장점

  1. 가독성: 들여쓰기를 통한 구조 표현 덕분에 사람이 읽고 이해하기 쉽습니다.
  2. 단순성: 간단한 문법으로 복잡한 데이터 구조를 쉽게 표현할 수 있습니다.
  3. 유연성: 다양한 데이터 형식을 표현할 수 있으며, 주석을 추가할 수 있어 문서화가 용이합니다.
  4. 호환성: 많은 프로그래밍 언어와 도구에서 지원됩니다.

단점

  1. 들여쓰기 오류: 들여쓰기를 통해 구조를 표현하므로, 들여쓰기 오류가 발생하면 파싱 오류가 발생할 수 있습니다.
  2. 표준화 문제: JSON에 비해 표준이 엄격하지 않아, 구현에 따라 파싱 결과가 다를 수 있습니다.
  3. 성능: JSON에 비해 파싱 속도가 느릴 수 있습니다.

 

사용 예시

다음은 YAML 파일의 간단한 예시입니다:

# 구성 파일 예시
server:
  host: "localhost"
  port: 8080

database:
  type: "mysql"
  host: "db.example.com"
  port: 3306
  username: "user"
  password: "password"

features:
  - authentication
  - logging
  - caching

 

사용 이유

  1. 구성 관리: YAML은 사람이 읽기 쉽고 쓰기 쉬운 형식이므로, 애플리케이션의 구성 파일로 자주 사용됩니다.
  2. 데이터 직렬화: 복잡한 데이터 구조를 간단하게 표현할 수 있어 데이터 직렬화 및 역직렬화에 유용합니다.
  3. 도구와의 통합: 많은 도구와 프레임워크가 YAML을 구성 파일 형식으로 채택하고 있어, 다양한 환경에서 쉽게 통합할 수 있습니다.
  4. 주석 기능: YAML은 주석을 지원하므로, 구성 파일 내에 설명을 추가하여 문서화를 할 수 있습니다.

사용 이유 구체적 예시

1. Kubernetes: Kubernetes는 클러스터 구성 및 애플리케이션 배포를 위해 YAML 파일을 사용합니다.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: mycontainer
      image: nginx

 
2. Ansible: Ansible은 IT 자동화를 위해 YAML 형식의 플레이북을 사용합니다.

- name: Install and start nginx
  hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started

 
3. Docker Compose: Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하기 위해 YAML 파일을 사용합니다.

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

 
YAML은 그 단순성과 가독성 덕분에, 많은 DevOps 도구와 구성 관리 시스템에서 널리 사용됩니다. YAML 파일을 사용하면 복잡한 설정을 명확하고 간결하게 표현할 수 있으며, 이는 유지보수성과 협업 효율성을 높이는 데 기여합니다.
 
 


YAML 과 JSON

YAML 파일과 JSON 파일 중 어떤 것을 사용할지는 주로 애플리케이션의 요구 사항, 데이터 형식의 복잡성, 가독성, 그리고 사용 편의성 등을 고려하여 결정합니다. 또한, 사용하는 도구나 라이브러리가 특정 형식을 요구하거나 권장하는 경우에도 선택에 영향을 미칠 수 있습니다.

선택 기준

  1. 가독성 및 편집 용이성:
    • YAML은 사람이 읽고 쓰기 쉽게 설계되어 있어, 복잡한 구성 파일이나 데이터 구조를 관리하는 데 유리합니다.
    • JSON은 더 간결하고 표준화된 형식이지만, 사람이 읽고 편집하기에는 다소 불편할 수 있습니다.
  2. 지원 및 호환성:
    • JSON은 웹 API와 많은 프로그래밍 언어에서 기본적으로 지원됩니다.
    • YAML은 DevOps 도구(예: Kubernetes, Ansible)와의 호환성에서 더 많이 사용됩니다.
  3. 데이터 구조의 복잡성:
    • YAML은 주석을 추가할 수 있고, 복잡한 데이터 구조를 더 쉽게 표현할 수 있습니다.
    • JSON은 단순한 데이터 구조를 표현할 때 적합하며, 데이터 교환 형식으로 많이 사용됩니다.

 

예제: Python에서 YAML과 JSON 처리

Python 라이브러리 설치:

  • YAML 처리를 위해 PyYAML 라이브러리를 사용합니다.
  • JSON 처리를 위해 기본 제공되는 json 라이브러리를 사용합니다
pip install pyyaml

 
Python 코드 작성:

import json
import yaml

def load_config(file_path):
    # 파일 확장자에 따라 YAML 또는 JSON으로 로드
    if file_path.endswith('.yaml') or file_path.endswith('.yml'):
        with open(file_path, 'r') as file:
            return yaml.safe_load(file)
    elif file_path.endswith('.json'):
        with open(file_path, 'r') as file:
            return json.load(file)
    else:
        raise ValueError("Unsupported file format")

def save_config(data, file_path):
    # 파일 확장자에 따라 YAML 또는 JSON으로 저장
    if file_path.endswith('.yaml') or file_path.endswith('.yml'):
        with open(file_path, 'w') as file:
            yaml.safe_dump(data, file)
    elif file_path.endswith('.json'):
        with open(file_path, 'w') as file:
            json.dump(data, file, indent=2)
    else:
        raise ValueError("Unsupported file format")

# 예제 데이터
config_data = {
    'server': {
        'host': 'localhost',
        'port': 8080
    },
    'database': {
        'type': 'mysql',
        'host': 'db.example.com',
        'port': 3306,
        'username': 'user',
        'password': 'password'
    },
    'features': [
        'authentication',
        'logging',
        'caching'
    ]
}

# YAML 파일로 저장
save_config(config_data, 'config.yaml')

# JSON 파일로 저장
save_config(config_data, 'config.json')

# YAML 파일로부터 로드
loaded_config_yaml = load_config('config.yaml')
print("Loaded YAML config:", loaded_config_yaml)

# JSON 파일로부터 로드
loaded_config_json = load_config('config.json')
print("Loaded JSON config:", loaded_config_json)

 

결론

YAML과 JSON 중 어떤 것을 사용할지는 상황에 따라 다릅니다.

  • YAML은 가독성이 좋고 주석을 지원하기 때문에, 복잡한 구성 파일이나 사람이 자주 편집하는 파일에 적합합니다.
  • JSON은 더 간결하고 표준화된 형식으로, 데이터 교환이나 간단한 데이터 구조를 저장하는 데 적합합니다.

각 파일 형식의 장단점을 고려하여 적절한 형식을 선택하고, 애플리케이션 코드 내에서 파일 형식을 동적으로 처리할 수 있습니다.