What is Serialization?
직렬화는 데이터를 관리할 때, 한 포맷에서 다른 포맷으로 데이터를 재구성하는 것을 의미한다. 오브젝트를 직렬화하는 것을 오브젝트를 마샬링 한다고도 한다.
Rest API에서 서버와 클라이언트는 JSON 형식으로 데이터를 주고받는다. 이때, 서버에서 해당 데이터를 처리하기 위해서는 객체를 JSON형태(혹은 그 반대로)로 변경해 주어야 한다. 이 경우 파이썬 객체를 JSON 객체로 변환하는 것을 serialization 반대로 JSON 객체를 파이썬 객체로 변환하는 것을 deserialization이라고 한다. REST API에서 직렬화는 필수적이라고 할 수 있다.
Django Rest Framework를 이용한 serialization
Django로 Rest API를 구축할 때 일반적으로 DRF를 사용한다. DRF가 제공하는 serialization 기능을 살펴보자. 이 장은 다음 DRF 공식 문서를 참고했다.
https://www.django-rest-framework.org/tutorial/1-serialization/
1 - Serialization - Django REST framework
This tutorial will cover creating a simple pastebin code highlighting Web API. Along the way it will introduce the various components that make up REST framework, and give you a comprehensive understanding of how everything fits together. The tutorial is f
www.django-rest-framework.org
Model
다음은 예시에 사용할 모델이다.
from django.db import models
class Board(models.Model):
category = models.CharField(max_length=50)
createdAt = models.DateTimeField(auto_now_add=True)
updatedAt = models.DateTimeField(auto_now_add=True)
content = models.TextField()
recommend = models.IntegerField()
class Meta:
ordering = ['createdAt']
Serializer class 생성
serializing 작업을 위해 serializer class를 생성한다. 이 클래스의 형태는 Django froms 클래스와 비슷하다.
drf가 제공하는 serializer의 종류로는 여러가지가 있는데 그 중 ModelSerializers를 자주 사용한다. 일반 serializer를 사용하는 경우에는 모델 클래스의 필드 값들을 일일히 지정해 주어야 하는 번거로움이 있다. ModelSerializers의 경우는 기존에 생성한 model의 필드 값들을 불러온 다음 사용할 필드 집합을 따로 지정하는 형태를 띈다. 일반 Serializers가 Django froms와 유사한 형태이듯 ModelSerializers는 Django ModelFroms와 유사한 형태를 가지고 있다. ModelSerialzers로 생성한 클래스는 다음과 같다.
from rest_framework import serializers
from .models import Board
class BoardSerializer(serializers.ModelSerializer):
class Meta:
model = Board
fields = ['category', 'createdAt', 'updatedAt', 'content', 'recommend']
Serializer class의 인스턴스는 print(repr()) 메서드를 통해 그 구조를 알아볼 수 있다. 또한 ModelSerializers는 기본적으로 create()와 update()메서드가 포함되어 있다.
Writing regular Django views using our Serializer
이어서 view에서 방금 만든 Serializer를 어떻게 사용하는지 예시를 살펴보겠다. 예시는 공식 문서의 코드를 그대로 가져왔다. 프로젝트에서는 함수기반 view가 아닌 DRF의 제너릭을 상속한 클래스 기반 view를 사용할 예정이다.
views.py
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@csrf_exempt
def snippet_list(request):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = SnippetSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
@csrf_exempt
def snippet_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return JsonResponse(serializer.data)
elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = SnippetSerializer(snippet, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400)
elif request.method == 'DELETE':
snippet.delete()
return HttpResponse(status=204)
이 테스트에서 클라이언트가 CSRF토큰 없이 POST요청을 할 수 있도록 @csrf_exempt를 추가했다.
'Backend > Django' 카테고리의 다른 글
2022-03-02::DRF Class기반 view (0) | 2022.03.02 |
---|---|
2022-03-02::DRF Requests and Responses (0) | 2022.03.02 |
2022-02-25::Django 29-35 (0) | 2022.02.25 |
2022-02-24::Django Forms (0) | 2022.02.24 |
2022-02-24::Django Read, Create with sqlite3 (0) | 2022.02.24 |