파이썬의 pickle 모듈은 파이썬 객체 구조를 직렬화(Serialization)하고 역직렬화(Deserialization)하는 데 사용되는 표준 라이브러리입니다. 리스트, 딕셔너리 등 모든 종류의 파이썬 객체를 바이트 스트림(0과 1)으로 변환하는 과정을 피클링(Pickling), 직렬화, 플래트닝(Flattening), 마샬링(Marshalling)이라고 부릅니다. 반대로 피클링으로 생성된 바이트 스트림을 원래의 파이썬 객체로 되돌리는 과정은 언피클링(Unpickling)이라고 합니다.
왜 피클을 사용해야 할까요?
실무 환경에서 피클링과 언피클링은 매우 폭넓게 활용됩니다. 복잡한 객체 상태를 그대로 유지한 채 한 서버나 시스템에서 다른 시스템으로 손쉽게 전송할 수 있고, 파일이나 데이터베이스에 저장했다가 나중에 다시 불러올 수 있기 때문입니다. 머신러닝 모델 저장, 세션 데이터 관리, 프로그램 상태 스냅샷 등 다양한 용도로 활용됩니다.
사용 시 주의사항
신뢰할 수 없는 출처에서 받은 데이터는 절대 언피클링하지 않는 것이 좋습니다. 악성 코드가 포함된 피클 데이터는 역직렬화 과정에서 임의의 코드를 실행시켜 심각한 보안 위협이 될 수 있습니다. 특히 pickle 모듈은 악성 데이터를 자동으로 감지하거나 경고를 발생시키는 기능이 없으므로, 신뢰할 수 있는 데이터만 다루도록 해야 합니다.
pickle 모듈 임포트
피클링과 언피클링을 사용하려면 먼저 pickle 모듈을 임포트해야 합니다.
import pickle
피클링 예제
1. 간단한 리스트 피클하기 — pickle_list1.py
import pickle
mylist = ['a', 'b', 'c', 'd']
with open('datafile.txt', 'wb') as fh:
pickle.dump(mylist, fh)위 코드에서 "mylist" 리스트는 네 개의 요소('a', 'b', 'c', 'd')를 담고 있습니다. 모든 연산이 바이트 단위로 수행되기 때문에 일반 텍스트 모드인 "w"가 아닌 "wb"(바이너리 쓰기 모드)로 파일을 열어야 합니다. 실행하면 현재 작업 디렉터리에 "datafile.txt"라는 새 파일이 생성되고, mylist의 데이터가 바이트 스트림으로 변환되어 저장됩니다.
2. 간단한 리스트 언피클하기 — unpickle_list1.py
import pickle
pickle_off = open("datafile.txt", "rb")
emp = pickle.load(pickle_off)
print(emp)위 스크립트를 실행하면 저장해 두었던 mylist 데이터가 그대로 출력됩니다.
['a', 'b', 'c', 'd']
3. 간단한 딕셔너리 피클하기
import pickle
EmpID = {1:"Zack",2:"53050",3:"IT",4:"38",5:"Flipkart"}
pickling_on = open("EmpID.pickle","wb")
pickle.dump(EmpID, pickling_on)
pickling_on.close()4. 딕셔너리 언피클하기
import pickle
pickle_off = open("EmpID.pickle", 'rb')
EmpID = pickle.load(pickle_off)
print(EmpID)위 언피클링 스크립트를 실행하면 처음 초기화했던 딕셔너리가 그대로 복원됩니다. 여기서도 바이트 데이터를 읽기 때문에 "r"이 아닌 "rb"(바이너리 읽기 모드)를 사용한다는 점에 유의하세요.
출력 결과
{1: 'Zack', 2: '53050', 3: 'IT', 4: '38', 5: 'Flipkart'}피클 관련 주요 예외(Exceptions)
pickle 모듈을 사용할 때 자주 발생하는 대표적인 예외는 다음과 같습니다.
Pickle.PicklingError: 해당 객체가 피클링을 지원하지 않는 경우 발생합니다. 예를 들어 람다 함수나 열린 파일 핸들처럼 직렬화할 수 없는 객체를 피클링하려 할 때 나타납니다.
Pickle.UnpicklingError: 파일에 손상되었거나 유효하지 않은 데이터가 포함된 경우 발생합니다.
EOFError: 파일의 끝(end of file)이 감지되었을 때 발생합니다. 주로 빈 파일이나 불완전하게 저장된 피클 파일을 로드할 때 나타납니다.
피클의 장점
복잡한 데이터 구조를 손쉽게 저장하고 복원할 수 있습니다.
사용법이 간단하고 가볍며, 몇 줄의 코드만으로 직렬화가 가능합니다.
생성된 피클 파일은 사람이 직접 읽기 어려운 바이너리 형식이므로 어느 정도의 보안성을 제공합니다.
피클의 단점
파이썬 외의 다른 언어에서는 피클된 파이썬 객체를 재구성하기 어렵습니다. 즉, 언어 간 호환성이 떨어집니다.
악성 소스에서 전달된 데이터를 언피클링할 경우 보안 위험이 큽니다.
마치며
pickle 모듈은 파이썬 객체를 그대로 보존하며 저장하고 불러올 수 있는 강력한 도구입니다. 다만 외부 데이터에는 사용을 삼가고, 언어 간 호환이 필요한 경우라면 JSON 같은 범용 직렬화 형식을 사용하는 것이 안전합니다. 신뢰할 수 있는 환경에서 적절히 활용하면 데이터 영속화 작업을 크게 단순화할 수 있습니다.