728x90
시리얼라이저(Serializer)는 Django REST framework (DRF)에서 제공하는 기능으로, Django 모델 인스턴스와 기타 데이터 타입을 JSON, XML, 또는 다른 콘텐츠 타입으로 변환(직렬화)하거나, 반대로 그 데이터를 다시 Python 데이터 타입으로 변환(역직렬화)하는 역할을 합니다. 이를 통해 API 요청과 응답에서 데이터의 변환 및 검증을 효율적으로 처리할 수 있습니다.
주요 기능
- 직렬화: Python 객체(예: Django 모델 인스턴스)를 JSON, XML 등의 포맷으로 변환.
- 역직렬화: JSON, XML 등의 포맷으로 받은 데이터를 Python 객체로 변환.
- 검증: 입력된 데이터가 올바른지 검증.
Serializer 클래스 정의
Django REST framework에서 시리얼라이저를 사용하려면 serializers.Serializer 클래스를 상속받아 정의합니다. 또한 serializers.ModelSerializer를 사용하여 Django 모델과 쉽게 연동할 수 있습니다.
예제
다음은 MyModel이라는 Django 모델을 위한 시리얼라이저를 정의하고 사용하는 예제입니다.
1. 모델 정의
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
value = models.IntegerField()
2. 시리얼라이저 정의
from rest_framework import serializers
from .models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['id', 'name', 'value']
3. 뷰 정의
from rest_framework import viewsets
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
4. URL 설정
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet
router = DefaultRouter()
router.register(r'mymodel', MyModelViewSet)
urlpatterns = [
path('', include(router.urls)),
]
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet
router = DefaultRouter()
router.register(r'mymodel', MyModelViewSet)
urlpatterns = [
path('', include(router.urls)),
]
시리얼라이저의 사용 예
- 직렬화: 모델 인스턴스를 JSON으로 변환
-
instance = MyModel.objects.first()serializer = MyModelSerializer(instance)json_data = serializer.data
- 역직렬화: JSON 데이터를 모델 인스턴스로 변환
json_data = {'name': 'Example', 'value': 123}serializer = MyModelSerializer(data=json_data)if serializer.is_valid():instance = serializer.save()
추가 기능
- 필드 수준 검증: 특정 필드의 값을 검증하는 메서드를 정의할 수 있습니다.
- 객체 수준 검증: 객체 전체를 검증하는 메서드를 정의할 수 있습니다.
- 커스텀 필드: 기본 필드 외에 추가적인 커스텀 필드를 정의할 수 있습니다.
필드 수준 검증 예제
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['id', 'name', 'value']
def validate_value(self, value):
if value < 0:
raise serializers.ValidationError("Value must be non-negative.")
return value
객체 수준 검증 예제
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['id', 'name', 'value']
def validate(self, data):
if data['name'] == 'Invalid' and data['value'] < 0:
raise serializers.ValidationError("Invalid name cannot have a negative value.")
return data
이와 같이, 시리얼라이저는 데이터의 직렬화, 역직렬화, 검증을 위해 필수적인 역할을 수행하며, Django REST framework를 사용할 때 핵심적인 부분을 차지합니다.
- 클라이언트 > 역직렬화 > 서버 > 직렬화 > 클라이언트
- 클라이언트 > 서버: 역직렬화 (Deserialization) - JSON 데이터가 Python 객체로 변환됩니다.
- 서버 > 클라이언트: 직렬화 (Serialization) - Python 객체가 JSON 데이터로 변환됩니다.
728x90