개발 문서/Django

Django REST Framework: Serializer의 Partial Update?

copg 2025. 3. 17. 12:28
728x90
반응형

Django REST Framework(DRF)를 사용하다 보면 데이터의 부분 수정(Partial Update)을 처리해야 할 때가 있습니다. 이때 Serializer의 partial 옵션을 활용하면 편리하게 작업할 수 있습니다. 이번 포스팅에서는 Serializer의 partial이 무엇인지, 어떻게 사용하는지, 주의할 점은 무엇인지 상세하게 알아보겠습니다.

Partial Update란?

Partial Update는 말 그대로 객체의 일부 필드만을 수정하는 것을 의미합니다. 전체 데이터를 수정하는 PUT 요청과 달리 PATCH 요청을 통해 일부 데이터만 선택적으로 업데이트할 수 있도록 도와줍니다.

  • PUT: 객체의 모든 필드를 업데이트해야 함.
  • PATCH: 객체의 일부 필드만 업데이트 가능.

Serializer에서 Partial 옵션 사용법

DRF의 Serializer를 사용할 때 partial=True로 설정하면 일부 필드만으로도 유효성 검사를 통과시킬 수 있습니다.

기본 사용 예제

# serializers.py
from rest_framework import serializers
from .models import Profile

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ['id', 'username', 'email', 'bio']

위의 Serializer를 이용해 객체를 부분적으로 업데이트하는 방법을 살펴보겠습니다.

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Profile
from .serializers import ProfileSerializer

class ProfileDetailAPIView(APIView):
    def patch(self, request, pk):
        profile = Profile.objects.get(pk=pk)
        serializer = ProfileSerializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

위 코드에서 핵심은 바로 partial=True입니다. 이 설정이 없다면 Serializer는 모든 필드를 요구하게 되므로 일부 필드만 수정하고자 할 때는 반드시 설정해야 합니다.

예제 요청 및 응답

PATCH 요청의 예시는 다음과 같습니다.

  • 요청 예시
PATCH /api/profiles/1/
{
    "bio": "새로운 자기소개입니다."
}
  • 응답 예시
{
    "id": 1,
    "username": "user123",
    "email": "user123@example.com",
    "bio": "새로운 자기소개입니다."
}

주의사항

1. Validation 주의

부분 업데이트 시에도 필드별 validation은 정상적으로 수행됩니다. 특정 필드에 validation 로직이 있는 경우 이를 충족하지 못하면 validation error가 발생할 수 있습니다.

2. Required 필드 주의

Serializer에서 필드를 required=True로 설정한 경우, 전체 업데이트에서는 필수지만 부분 업데이트에서는 해당 필드가 제공되지 않아도 문제가 되지 않습니다. 하지만, 제공될 경우는 반드시 유효해야 합니다.

예시:

email = serializers.EmailField(required=True)
  • 전체 업데이트(PUT) 시: 반드시 필요
  • 부분 업데이트(PATCH) 시: 제공되지 않아도 됨, 단, 제공할 경우 유효해야 함

활용 팁

1. ViewSet 활용하기

일반적인 APIView보다 DRF의 ViewSet을 사용하면 더욱 간편히 부분 업데이트를 처리할 수 있습니다.

# views.py
from rest_framework import viewsets

class ProfileViewSet(viewsets.ModelViewSet):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer

ModelViewSet은 기본적으로 partial_update 메서드를 지원하여 편리하게 PATCH 요청을 처리합니다.

2. Serializer 내에서 조건부 validation 구현

Serializer의 validate_<field> 메서드를 통해 특정 조건에서만 필드 검사를 수행하도록 구현할 수 있습니다.

def validate_email(self, value):
    if self.partial and value == "":
        raise serializers.ValidationError("빈 이메일은 허용되지 않습니다.")
    return value

결론

Django REST Framework의 partial=True 옵션을 활용하면 API를 더욱 유연하게 구성할 수 있습니다.