DRF tutorial 01.직렬화

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


직렬화?

데이터구조나 오브젝스 상태를 동일하거나 다른 컴퓨터 환경에 저장하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.

객체는 메모리 상에 있는데, 이 객체 자체를 저장시킬 수 있을까?

예로 들어 클래스의 인스턴스에 이 객체 자체를 db가 아닌 객체 자체의 저장이 가능할까?

텍스로 저장은 가능한데(파일을 쓰는것) 근데 이 객체 자체를 쓰는 것 자체를 직렬화라고 하고 이는 객체가 메모리 상에 있을때, 이를 직렬화 하여 데이터로 만들고 이를 파일형태로 기록하는 것을 의미한다.

직렬화 자체는 연속적인 데이터로 만든다고 생각하면 쉽다. 파일 같은 것을 스트링데이터라고 하는데 이는 연속적인 데이터라는 의미이지만, 메모리 상에 존재하는 객체는 연속적인 데이터가 아니기때문에 어딘가에 존재하고 존재하지 않는다. 이를 연속적인 데이터로 만드는것을 직렬화라고 하고, 연속적인 데이터는 파일형태로 기록이 가능하다.

그래서 객체의 어떤 형체가 있고 데이터가 있으면 이를 나중에 객체로 만들 수 있는 방법을 이용해서 파일 형태로 기록도 가능하다. 아니면 그 데이터 형식으로 파일을 전송하거나 등등등

만약 그 데이터만 다시 불러올 수 있다면 역직렬화 과정을 통해서 다시 메모리상에 객체를 불러올 수도 있다. 이 과정을 직렬화, 역직렬화라고 한다.

파이썬에 내장된 직렬화로는 pickle이 있다.

Pickle

class User:
  def __init__(self,name):
    self.name = name
  def __repr__(self):
    return self.name
u = User(name='pjh')

u
>>> pjh

type(u)
>>> __main__.User

u.age = 10

위와 같은 상황에서 보통 django였다면 u.save()를 해서 저장하려고 했겠지만, 객체의 경우 이같은 방법은 불가능하다.

import pickle
with open('user.pickle', 'wb') as f:
  pickle.dump(u,f)

이렇게 하면 User의 객체인 u(User인스턴스)는 open한 파일에 기록이 되었다. 근데 여기서 wt가 아니라 wb인데, 이는 텍스트 데이터가 아니라 binary data로 저장을 했다.

그리고 종료후 다시 ipython으로 들어간다.

import pickle
with open('user.pickle', 'rb') as f:
  user = pickle.load(f)

이래서 pickle같은 경우 python인스턴스를 되돌리는 방법은 있지만 클래스 정의 자체는 없다. 따라서 클래스 정의는 다시 해줘야 한다. 이런 식으로 만드는 과정도 직렬화이다.

이러한 pickle은 python의 버전의 영향을 많이 받기 때문에 python 3.6에서 사용했던 pickle은 python 3.7에서는 사용이 불가능할수도 있다.

그래서 우리는 json방식으로 데이터를 직렬화하고 이를 통해서 python객체를 만들것이다. pickle로 만든 객체는 무조건 python 객체로 돌아오지만 json은 자동으로 돌아오게 하지는 않는다.