직렬화(노션으로 이동완료)

2022. 5. 23. 02:11

통신 방식의 변화

  • 기존에는
    • Get 요청 > HTML Form 포멧으로 응답
    • Post 요청시 multipart/form-data인코딩을 요청하고(데이터를 전송하고) HTML 포맷으로 응답
  • 최근에는
    • API 서버에서 대개 JSON 인코딩된 요청을 응답(JSON을 활용하여 요청 및 응답)

 

직렬화 

  • 어떤 프로그래밍 언어를 사용하든지, 통신에서 데이터는 필히 문자열로 표현되어야 함
    • 송신자 : 데이터인 객체를 직렬화를 통해 문자열로 변환하여 전송
    • 수신자 : 수신한 문자열을 비직렬화를 통해 객체데이터로 변환하여 활용
  • Json, XML등은 모든 언어에서 지원하는 직렬화 포멧임. 즉 어떤언어에서든 통신을 위한 수단으로 사용될 수 있기에, 다른 언어들 간의 소통도 가능하다
    • 다른 말로 하면, 모든 언어가 Json/XML 등에 대한 직렬화/비직렬화 방식을 가지고 있다라고 생각해도 됨
    • 파이썬의 입장에서 pickle에 비해 직렬화를 지운하는 데이터 타입(자료형)의 수가 적음. 물론 커스텀 rule을 추가하여 이러한 점을 보완할 수 있다
  • 그 외에 특정 언어에서만 지원하는 직렬화 포멧도 있음
    • 파이썬의 경우 pickle이 존재하며, 파이썬 시스템끼리 통신할 때 매우 유용하다.

 

json을 활용한 직렬화/비직렬화 예시

  • json은 특정 자료형을 말하는 게 아님. 통신의 방식이고, 그 통신에서는 오로지 str문이 사용된다.
    • 즉 파이썬에서 json과 관련된 함수는 통신을 위하여 어떻게 데이터를 str로 바꿀 것인지,
    • 혹은 반대로 들어온 str형태의 데이터를 사용하기 위하여 어떻게 자료형으로 바꿀것인지와 관련됨
  • json.dumps()를 활용하여 데이터를 json으로 직렬화
    • dict 원소 두개를 감싸고 있던 list자료형 전체를 json.dumps를 활용해 str로 변환
    • 즉 직렬화를 실행하여 데이터를 문자열로 바꾸었음
    • 문자열로 바뀌었으니 이제 통신 가능
  • json.loads()를 사용하여 문자열 자료를 파이썬 자료형으로 비직렬화
    • str문을 json.loads()를 활용해 list와 dict로 변경
    • 즉 비직렬화를 통해 통신으로 들어온 str문을 파이썬 자료형으로 바꾸었음
    • 아래의 예시에서 확인할 수 있듯, list 자료형의 원소인 dict도 확인할 수 있다
    • 데이터로 바뀌었으니 사용 및 저장 등이 가능
import json

#직렬화 할 객체 데이터 준비
post1 = {'title':'hello','content':'my first post'}
post2 = {'title':'second hello','content':'my second post'}
post_list = [post1,post2]

#직렬화
dumped_list = json.dumps(post_list)

#직렬화 확인
print(dumped_list) 
###출력: '[{"title": "hello", "content": "my first post"}, {"title": "second hello", "content": "my second post"}]'
print(type(dumped_list)) 
###출력: str


##비직렬화(다시 객체 데이터화)
loaded_list = json.loads(json_string)

#비직렬화 확인
print(loaded_list)
###출력 : [{'title': 'hello', 'content': 'my first post'}, {'title': 'second hello', 'content': 'my second post'}]
print(type(loaded_list))
###출력 : list
print(type(loaded_list[0]))
###출력 : dict

 

  • 안타깝게도(당연하지만) 장고의 객체를 직렬화하는 것은 불가능하다
    • 그냥 리스트 컴프리핸션 등을 사용해 직접변환하는 게 제일 easy한 방법
    • 그 외에, drf의 JSONRENDER사용
    • Model에 대해서는 ModelSerializer를 사용하는 방법 등이 있다.(Model Serializer를 쓰면 바로 직렬화가 된다는 게 아니라 그냥 조금 더 편하게 할 수 잇다~ 정도의 느낌임)

 

'django > drf' 카테고리의 다른 글

Serializer(노션으로 이동완료)  (0) 2022.05.26

BELATED ARTICLES

more