8.1 직렬화란 무엇인가
파일을 다루고 데이터를 저장하고 읽는 법을 배운 후, 이제 파일을 진지하게 다루는 법을 배울 때야. 오늘 우리는 직렬화에 대해 공부하기 시작할 거야.
직렬화란 객체를 바이트의 시퀀스나 파일에 저장하거나 네트워크로 전송하거나 데이터베이스에 저장할 수 있는 형식으로 변환하는 과정을 말해. 역직렬화는 이 바이트 시퀀스로부터 원래의 객체를 복원하는 반대 과정이야.
객체를 파일에 저장하거나(또는 네트워크로 전송하거나) 위해서는 기록하기 쉽고 읽기 쉽도록 문자열(또는 바이트 집합)로 변환해야 해.
직렬화가 사용되는 주요 네 가지 방향이 있어:
- 객체 상태 저장: 프로그램 실행 사이에 객체의 상태를 저장하기 위해서.
- 데이터 전송: 시스템의 다른 구성 요소 간 또는 다른 시스템 간에 객체를 전송하기 위해서.
- 캐싱: 빠른 접근을 위해 객체를 캐시에 저장하기 위해서.
- 데이터베이스: 데이터베이스에 복잡한 데이터 구조를 저장하기 위해서.
직렬화를 담당하는 라이브러리는 아주 많고, 각각의 라이브러리는 특정한 목적을 가지고 만들어졌어. 우리는 그 중 다섯 개를 살펴볼 것이고, 두 개는 아주 상세히 알아볼 거야.
가장 인기 있는 것들을 살펴보자:
- 모듈
pickle
- 모듈
json
- 모듈
yaml
- 모듈
marshal
- 모듈
shelve
아래는 각 모듈의 간단한 개요야:
8.2 모듈 pickle
pickle
은 Python 객체를 직렬화 및 역직렬화하는 내장 모듈이야.
사용자가 정의한 클래스 포함해서 거의 모든 Python 객체를 저장하고 복원할 수 있어.
pickle
사용 예:
import pickle
# 직렬화할 객체 예제
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# 객체를 파일로 직렬화
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# 파일로부터 객체를 역직렬화
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
8.3 모듈 json
json
은 JSON (JavaScript Object Notation)을 다루기 위한 내장 모듈이야.
JSON은 클라이언트와 서버 간의 데이터 교환에 사용되는 텍스트 형식이야.
json
사용 예:
import json
# 직렬화할 객체 예제
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# 객체를 JSON 문자열로 직렬화
json_string = json.dumps(data)
print(json_string)
# 객체를 JSON 파일로 직렬화
with open('data.json', 'w') as file:
json.dump(data, file)
# JSON 문자열로부터 객체를 역직렬화
loaded_data = json.loads(json_string)
print(loaded_data)
# JSON 파일로부터 객체를 역직렬화
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
8.4 모듈 yaml
yaml
(YAML Ain't Markup Language)은 사람이 읽을 수 있는 데이터 직렬화 형식이야.
Python에서 YAML을 다루기 위해서는 외부 라이브러리인 PyYAML을 사용해.
yaml
사용 예:
import yaml
# 직렬화할 객체 예제
data = {'name': 'Carol', 'age': 27, 'is_student': False}
# 객체를 YAML 문자열로 직렬화
yaml_string = yaml.dump(data)
print(yaml_string)
# 객체를 YAML 파일로 직렬화
with open('data.yaml', 'w') as file:
yaml.dump(data, file)
# YAML 문자열로부터 객체를 역직렬화
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
# YAML 파일로부터 객체를 역직렬화
with open('data.yaml', 'r') as file:
loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)
8.5 모듈 marshal
marshal
은 Python 객체의 직렬화를 위한 내장 모듈이야, 주로 Python 코드의 직렬화에 사용돼.
pickle
보다 빠르지만 지원하는 객체 유형이 적고 유연하지 않아.
marshal
사용 예:
import marshal
# 직렬화할 객체 예제
data = {'name': 'Dave', 'age': 35, 'is_student': True}
# 객체를 파일로 직렬화
with open('data.marshal', 'wb') as file:
marshal.dump(data, file)
# 파일로부터 객체를 역직렬화
with open('data.marshal', 'rb') as file:
loaded_data = marshal.load(file)
print(loaded_data)
8.6 모듈 shelve
shelve
은 Python 객체를 파일에 저장하기 위한 키-값 기반의 저장소를 제공하는 내장 모듈이야, 마치 사전처럼 말이야.
shelve
사용 예:
import shelve
# 직렬화할 객체 예제
data = {'name': 'Eve', 'age': 28, 'is_student': False}
# 객체를 파일로 직렬화
with shelve.open('data.shelve') as db:
db['person'] = data
# 파일로부터 객체를 역직렬화
with shelve.open('data.shelve') as db:
loaded_data = db['person']
print(loaded_data)
모듈과 데이터 저장 형식 자체는 다르지만, 프로그래머 입장에서의 작업은 매우 비슷해. 아래에서 모듈 pickle
와
모듈 json
와의 작업을 더 자세히 살펴볼 거야.
GO TO FULL VERSION