[DRF] Serializer가 뭘까

김재연·2022년 7월 7일
3
post-thumbnail

아직도 대체 Serializer가 뭘 하는 놈인지 잘 모르겠다. 누가 물어보면 "어..... 직렬화?"라고 밖에 못할 수준.. 장고의 form이랑 비슷하다는데 실컷 직렬화 어쩌고 저쩌고 하다가 갑자기 폼이 왜 나오는지 싶다. 그래서 이참에 정리해보려고 한다


Rest API

Rest API는 Rest를 기반으로 만들어진 API를 의미한다.

Rest는 Representational State Transfer의 약자로, 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 말한다.

다시 말해,

  1. HTTP URI를 통해 자원(resource)을 명시하고,
  2. HTTP Method(POST, GET, PUT, DELETE)를 통해
  3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것

데이터가 요청될 때 JSON이나 XML을 통해 상태(정보)를 주고 받는다.


DRF

DRF는 Django 안에서 이러한 Rest API를 쉽게 만들 수 있도록 도와주는 라이브러리다.

웹 브라우저 API는 범용성이 커서 개발을 쉽게 만들어주고, 시리얼라이즈 기능도 제공해주기 때문에 DRF를 사용한다.


Serializer

Serialize (직렬화)
: 쿼리셋, 모델 인스턴스와 같은 복잡한 데이터를 JSON, XML과 같이 간단한 데이터로 변환하는 것

즉, Serializer는 우리가 Django에서 사용하는 파이썬 객체나 쿼리셋 같이 복잡한 객체들을 Rest API에서 사용할 간단한 JSON 형태로 변환해주는 어댑터같은 것이다.

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()
serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 
#  'created': '2016-01-27T15:17:10.375877'}

=> comment라는 DB 인스턴스를 CommentSerializer라는 어댑터를 이용해서 JSON 형식으로 직렬화

  • create()update() 메소드를 오버라이딩 해서 인스턴스를 저장할 수 있다.
class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

    def create(self, validated_data):
        return Comment(**validated_data)

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.content = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance
  • 이후 데이터를 deserializing할 때 save()를 호출해서 저장할 수 있다. save는 인스턴스가 존재하면 update(), 아니면 create()를 해준다. save() 안에 추가적인 attribute도 사용할 수 있고, 오버라이딩도 가능
# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

serializer.save()

Deserialize : 받은 데이터를 validating 한 후에 parsed data를 객체(원래의 복잡한 형태)로 다시 변환하는 과정. 이때는 꼭 is_valid()를 호출해서 검증해야 한다.

django-serializer 자세히 알아보기


❓ 여기서 생기는 의문점...

내가 기존에 썼던 serializer들을 보면 다 이렇게 생겼다.

아..... 내가 그동안 쓴건 ModelSerializer 였다.


ModelSerializer

그럼 ModelSerializer는 뭘까?

ModelSerializer❗ 모델을 JSON으로 ❗ 쉽게 바꿔주는 것이다. 장고로 개발을 할 때는 모델을 만드는게 가장 첫단계고 필수적이니 모델시리얼라이저를 쓰는게 당연했던거였다. 이미 선언해둔 모델을 가지고 직렬화를 하는건가보다.

ModelSerializer를 쓰면 내가 원하는 모델의 필드들만 json으로 만들어줄 수 있다고 한다. Meta 클래스에 직렬화를 할 모델을 쓰고, json으로 만들어줄 필드들을 쓰면 된다.

몇개월을 했는데 처음 알았다....ㅋㅋㅋㅋ


정리

나름대로 정리를 해보자면 DRF로 rest API 개발을 할때 데이터를 json 형식으로 주고 받는데, 장고에서 쓰는 모델객체를 쉽게 전달하기 위해 json으로 변환시켜주는게 serializer의 역할이다. 그래서 drf 템플릿을 보면 모델 인스턴스들이 다 json 형식으로 보였던건가 보다. form이랑 비슷하다는건 "데이터를 전달한다"는 점에서 비슷하다고 말한건가보다.

profile
일기장같은 공부기록📝

0개의 댓글