[Django REST Framework] Serializer 직렬화/역직렬화 과정

janjanee·2022년 8월 7일
0

django & drf

목록 보기
1/1
post-thumbnail

🤜 Serialiazer를 이용해서 직렬화/역직렬화 과정을 이해하기!

python3 manage.py shell

또는 Pycharm에서 제공하는 Python Console을 사용한다.

직렬화

CategorySerializer를 사용할 것이고 3개의 필드로 구성되어있다.

Category 모델의 데이터를 조회하면 3개의 데이터가 존재하는데
첫번째 데이터를 변수 c에 넣어보겠다.

직렬화 할 때는 Serializer의 인자 중 instance 인자에 데이터를 넣는다.

Serializer를 생성 후 sr.data로 확인해보면 DB에서 가져온 인스턴스가
dict 타입으로 변환된 것을 확인할 수 있다.

type을 확인해보면 ReturnDict 타입인데 DRF에서 dict에 기능을 추가한 타입이고 최종적으로는
이 데이터를 byte string 타입의 데이터로 변환해서 클라이언트에게 전달한다.

JSONRenderer를 import 후 render() 함수에 데이터를 넣는다.

type을 확인해보면 json 포맷으로 변환된 byte string이고

이 데이터를 클라이언트 응답에 보낸다.


역직렬화

위에서 만든 byte string인 json을 클라이언트에서 받았다고 가정하고

반대 상황인 역직렬화를 해본다.

byte string 데이터를 파싱하기 위해 JSONParserBytesIO를 import 후 파싱하면 dict로 변환된다.

역직렬화를 할 때는 Serializer의 data 인자에 넣는다.

역직렬화 한 경우에는 is_valid() 메소드로 데이터가 유효한지 검사를 한다.

유효하면 True, 유효하지 않으면 False
인데 False가 떠서 errors로 확인해보니

name이 unique인데 앞에서 만든 데이터를 그대로 역직렬화 하려다 보니 unique 유효성 검사에 실패했다.

데이터를 수정 후 다시 해본다.

name은 "GAME" 으로 변경하고 description도 "게임 관련 정보"로
변경하고 다시 해보니 is_valid()가 True로 통과했다.

유효성 검사에 통과된 데이터는 validated_data 필드에
저장되고 DB에 저장할 instance를 만들 때는 해당 필드로 만들게 된다.

마지막으로 save() 를 한 후에 확인해보면
GAME 카테고리가 정상적으로 저장된 것을 확인할 수 있다.


DRF View code

DRF 코드 내부를 보면서 직렬화 / 역직렬화 과정을 살펴보기

  • RetrieveAPIView

    Retrieve는 DB에 있는 데이터를 조회해서 보여주기 때문에 직렬화가 발생하는데
    이때 get_serializer(instacne=) 로 첫번째 인자인 instance에 db에서 가져온 데이터를 넣는다.

    serializer.data는 dict 타입이고 Response 클래스에서 render로 byte string을
    만들고 클라이언트 응답까지 처리한다.

  • CreateAPIView

    Create는 클라이언트에게 데이터를 받아 역직렬화가 발생하고 get_serializer(data=)
    data 인자에 클라이언트에서 받은 data를 넣는다.

    is_valid() 유효성 검사를 한 후 perform_create() 에서 인스턴스를 생성 후 DB에 save한다.

  • UpdateAPIView

    Update도 Create와 마찬가지로 클라이언트에게 데이터를 받아 역직렬화가 발생한다.
    Create와 다르게 get_serializer(instance=, data=) 속성 두 가지를 받고
    이후 동작은 같다.


정리

  • 직렬화

    DB -> instance -> Serializer(instance=xxxx) -> dict -> json data(bytes) -> response

  • 역직렬화
    Client(json data) -> dict -> Serializer(data=xxxx)
    -> is_valid(), validated_data -> instance -> save()


References

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-drf
https://www.cdrf.co/

profile
얍얍 개발 펀치

0개의 댓글