시리얼라이저가 무엇이고 왜 사용해야 하는지 알아본 후, DRF에서 어떻게 사용할 수 있는지 확인해보자.
시리얼라이저란?
시리얼라이저는 객체나 데이터를 저장하거나 통신하기 위해 다른 형식으로 변환, 즉 직렬화하거나 역직렬화하는 프로세스이다.
왜 사용해야 할까?
- 다양한 환경에서 데이터를 일관성 있게 처리하려면 약속된 형식으로 표준화되어야 하기 때문이다.
- 복잡한 구조를 가진 객체를 간결한 형식으로 변환해 전송 효율성을 높일 수 있다.
- 암호화 및 서명을 통해 데이터 보안을 강화할 수 있다.
- 역직렬화를 통해 다시 객체로 변환할 때 오류를 검증해 무결성을 유지할 수 있다.
- 메모리 상에 존재하는 객체의 상태를 직렬화해 영속적으로 보존이 가능하다.
이제 DRF에서 시리얼라이저로 CRUD를 구현해보자. DRF 시리얼라이저가 제공하는 기본 직렬화 형식은 JSON이다.
# serializers.py
from rest_framework import serializers
from .models import ArticleModel
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = ArticleModel
fields = ('title', 'content')
이렇게 시리얼라이저를 정의할 수 있다. Meta클래스에는 현재 정의하는 시리얼라이저가 직렬화할 모델과 필드를 명시해야 한다.
# views.py
...
from rest_framework.decorators import api_view
from .serializers import ArticleSerializer
@api_view(["GET", "POST"])
def articles_view(request):
if request.method == "GET":
articles = ArticleModel.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == "POST":
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.error)
위 뷰 함수의 역할은 GET 요청은 모든 아티클을 보내주고, POST 요청은 데이터를 받아 새로운 아티클을 생성한다. 시리얼라이저에 아티클 집합임을 명시하기 위해 many=True
를 주었다.
POST의 시리얼라이저는 받아온 데이터를 역직렬화한다. 이때 반드시 객체를 검증한 뒤 저장해야 한다. 에러가 발생할 경우 확인을 위해 에러 메시지를 보내고 있지만 개발 중이 아니라면 이렇게 노출하는 것은 권장되지 않는다.
# views.py
...
@api_view(["GET", "PUT", "DELETE"])
def article_view(request, pk):
if request.method == "GET":
article = get_object_or_404(ArticleModel, pk=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == "PUT":
article = get_object_or_404(ArticleModel, pk=pk)
serializer = ArticleSerializer(article, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.error)
elif request.method == "DELETE":
article = get_object_or_404(ArticleModel, pk=pk)
article.delete()
return Response()
상세페이지 보기, 수정, 삭제를 처리하는 뷰 함수이다. 수정하는 경우 시리얼라이저를 ArticleSerializer(article, data=request.data)
형식으로 사용하고 있다. 이렇게 사용하면 시리얼라이저가 내부적으로 받아온 데이터를 역직렬화해 기존의 모델 객체를 업데이트한다. 그 후에는 생성과 동일하게 처리하면 된다.