소개
현대 소프트웨어 개발에서 데이터는 주로 표준화된 형식으로 저장되고 전송됩니다. JSON(JavaScript Object Notation)과 YAML(YAML Ain't Markup Language)은 웹 API 응답부터 애플리케이션 설정 파일에 이르기까지 가장 널리 사용되는 두 가지 형식입니다.
이 실습에서는 Python에서 이러한 형식을 다루는 데 필요한 핵심 기술을 배웁니다. 먼저 Python 내장 json 모듈을 사용하여 JSON 데이터를 읽고 쓰는 방법을 익힙니다. 그 다음, 사람이 읽기 더 쉬운 대안인 YAML을 살펴보고 ruamel.yaml 라이브러리를 사용하여 이를 파싱하는 방법을 배웁니다. 마지막으로, 구현 세부 사항을 신경 쓸 필요 없이 다양한 파일 형식에서 데이터를 로드할 수 있게 하여 설정 관리를 단순화하는 강력한 도구인 anyconfig 라이브러리를 알아봅니다.
JSON 다루기
이 단계에서는 JSON 데이터를 직렬화(serialization)하고 역직렬화(deserialization)하는 방법을 배웁니다. JSON은 JavaScript Object Notation의 약자로, 데이터를 저장하고 전송하기 위한 경량 형식입니다. 서버에서 웹 페이지로 데이터를 보낼 때 흔히 사용됩니다.
참고: WebIDE(VS Code와 유사) 사용법이 익숙하지 않다면, 먼저 이 실습을 통해 학습하시기 바랍니다.
먼저 Python 딕셔너리를 JSON 파일로 작성해 보겠습니다. 이 과정을 직렬화라고 합니다.
왼쪽 파일 탐색기에서 json_handler.py 파일을 열고 다음 코드를 추가하세요. 이 스크립트는 output.json이라는 새 파일을 생성합니다.
## Write JSON file: json.dump() writes Python object as JSON
import json
content = {"name": "Joe", "age": 20}
with open("output.json", "w") as f: ## Open file in write mode
json.dump(content, f, indent=2) ## Write JSON with 2-space indentation
코드의 상세 설명은 다음과 같습니다:
import json: Python의 내장 JSON 모듈을 가져옵니다.content = {"name": "Joe", "age": 20}: 저장할 Python 딕셔너리를 정의합니다.with open("output.json", "w") as f::output.json파일을 쓰기 모드("w")로 엽니다.json.dump(content, f, indent=2):content딕셔너리를 JSON 형식으로 파일f에 씁니다.indent=2인자는 JSON을 2칸 들여쓰기로 포맷팅하여 가독성을 높입니다.
이제 터미널에서 스크립트를 실행하여 파일을 생성합니다:
python3 json_handler.py
별도의 출력은 없지만 output.json 파일이 생성되었습니다. cat 명령어를 사용하여 내용을 확인할 수 있습니다:
cat output.json
포맷팅된 JSON 내용을 확인할 수 있습니다:
{
"name": "Joe",
"age": 20
}
다음으로, JSON 파일을 Python 객체로 읽어오겠습니다. 이 과정을 역직렬화라고 합니다. 미리 준비된 data.json 파일을 읽어올 것입니다.
json_handler.py 파일을 다음 코드로 수정하세요:
## Read JSON file: json.load() parses JSON from file object
import json
with open("data.json", "r") as f: ## Open file in read mode
content = json.load(f) ## Parse JSON and return Python dict/list
print(content)
새로운 코드의 설명은 다음과 같습니다:
with open("data.json", "r") as f:: 기존data.json파일을 읽기 모드("r")로 엽니다.content = json.load(f): 파일에서 JSON 데이터를 파싱하여 Python 딕셔너리로 변환합니다.print(content): 결과 딕셔너리를 콘솔에 출력합니다.
스크립트를 다시 실행합니다:
python3 json_handler.py
이번에는 터미널에 Python 딕셔너리가 출력되는 것을 볼 수 있습니다:
{'username': 'labex', 'id': 12345}
YAML 다루기
이 단계에서는 사람이 읽기 쉽도록 설계된 데이터 직렬화 형식인 YAML을 살펴봅니다. JSON에 비해 YAML은 직접 수정하기가 더 쉽고 주석을 지원하여 설정 파일로 인기가 많습니다.
Python에는 내장 YAML 파서가 없으므로 타사 라이브러리를 설치해야 합니다. PyYaml과 ruamel.yaml이라는 두 가지 주요 라이브러리가 있습니다. ruamel.yaml 라이브러리는 YAML 사양을 더 잘 준수하며 파일을 수정할 때 주석과 포맷팅을 유지하는 데 더 뛰어납니다. 이 실습에서는 이를 사용하겠습니다.
먼저 pip를 사용하여 ruamel.yaml을 설치합니다:
pip install ruamel.yaml
설치가 성공했다는 메시지가 표시됩니다.
이제 이 라이브러리를 사용하여 config.yaml 파일을 읽어보겠습니다. 에디터에서 yaml_handler.py 파일을 열고 다음 코드를 추가하세요:
## Read YAML file using ruamel.yaml library
from ruamel.yaml import YAML
with open("config.yaml") as f:
yaml=YAML() ## Create YAML parser instance
data = yaml.load(f) ## Parse YAML and return Python dict/list
print(data)
코드 검토:
from ruamel.yaml import YAML: 라이브러리에서 필요한YAML클래스를 가져옵니다.with open("config.yaml") as f::config.yaml파일을 읽기 위해 엽니다.yaml=YAML(): YAML 파서 인스턴스를 생성합니다.data = yaml.load(f): 파일에서 YAML 내용을 파싱하여 Python 객체(여기서는 딕셔너리)로 변환합니다.print(data): 로드된 데이터를 출력합니다.
터미널에서 스크립트를 실행합니다:
python3 yaml_handler.py
출력 결과는 YAML 파일 내용을 Python 딕셔너리로 표현한 것입니다:
{'user': {'name': 'Alex', 'email': 'alex@example.com'}}
Anyconfig 사용하기
이 단계에서는 기본 설정 파일 형식을 추상화하는 매우 편리한 라이브러리인 anyconfig 패키지를 알아봅니다. 이 라이브러리를 사용하면 단 하나의 간단한 함수로 JSON, YAML, TOML 등 다양한 형식에서 Python 딕셔너리를 로드할 수 있습니다. 이는 애플리케이션이 여러 설정 형식을 지원해야 할 때 매우 유용합니다.
먼저 anyconfig를 설치해야 합니다. anyconfig는 YAML을 파싱하기 위해 백엔드가 필요한데, 이미 ruamel.yaml을 설치했으므로 자동으로 이를 사용하게 됩니다.
pip를 사용하여 anyconfig를 설치하세요:
pip install anyconfig
설치가 완료되면 anyconfig를 사용하여 설정 파일을 로드할 수 있습니다. 이전 단계의 config.yaml 파일을 로드하는 데 사용해 보겠습니다.
anyconfig_handler.py 파일을 열고 다음 코드를 추가하세요:
## anyconfig: load configuration files in various formats (JSON, YAML, TOML, etc.)
import anyconfig
## anyconfig.load() auto-detects the file format based on the extension.
conf = anyconfig.load("/home/labex/project/config.yaml")
print(conf)
이 코드는 훨씬 간단합니다:
import anyconfig: 라이브러리를 가져옵니다.anyconfig.load(...): 이 단일 함수가 파일을 열고, 읽고, 파싱합니다.config.yaml이 YAML 파일임을 자동으로 감지하여 적절한 파서를 사용합니다. 여기서 절대 경로를 사용했는데, 이는 스크립트의 위치가 달라질 수 있는 경우 좋은 관행입니다.
이제 스크립트를 실행합니다:
python3 anyconfig_handler.py
이 예제 역시 config.yaml을 로드하므로 출력은 이전 단계와 동일하지만, 필요한 코드는 훨씬 간결하고 유연합니다.
{'user': {'name': 'Alex', 'email': 'alex@example.com'}}
anyconfig를 사용하면 "config.yaml"을 "data.json"으로 바꾸고 스크립트를 다시 실행할 수도 있습니다. 코드를 변경할 필요 없이 그대로 작동하며, 출력되는 딕셔너리는 YAML 파일 대신 data.json의 내용을 반영하게 됩니다.
요약
이번 실습에서는 Python에서 흔히 사용되는 두 가지 데이터 직렬화 형식인 JSON과 YAML을 다루는 방법을 배웠습니다. 이러한 기술은 웹 API 작업, 애플리케이션 설정 관리, 데이터 교환과 같은 작업의 기초가 됩니다.
Python 내장 json 모듈을 사용하여 json.dump()로 Python 딕셔너리를 JSON 파일로 직렬화하고, json.load()로 JSON 파일을 다시 Python 객체로 역직렬화하는 방법을 배웠습니다.
다음으로, JSON의 가독성 높은 대안인 YAML을 살펴보았습니다. ruamel.yaml 라이브러리를 설치하고 이를 사용하여 YAML 파일을 파싱하는 방법을 익혔습니다.
마지막으로, 설정 관리를 단순화하는 강력한 도구인 anyconfig 라이브러리를 소개받았습니다. anyconfig.load() 함수를 사용하면 형식별 코드를 작성할 필요 없이 다양한 파일 형식에서 데이터를 읽을 수 있어 애플리케이션을 더 유연하고 유지보수하기 쉽게 만들 수 있음을 확인했습니다.



