1. Django REST Framework란?

출처: Django REST framework 공식 문서

출처: Django REST framework 공식 문서

Django Rest Framework은 파이썬 웹 프레임워크인 Django를 사용하여 RESTful API를 개발하는 데 필요한 도구와 기능을 제공하는 오픈소스 프레임워크입니다.

Django Rest Framework은 다음과 같은 기능을 제공합니다.

Serializer (시리얼라이저)

Serializer (시리얼라이저)

Serializer (시리얼라이저)

Django REST Framework의 가장 중요한 기능 중 하나로, 모델 데이터나 쿼리셋 등을 JSON 또는 XML과 같은 직렬화 가능한 데이터로 변환할 수 있습니다. 반대로 JSON 또는 XML과 같은 직렬화 가능한 데이터를 파싱하여 모델 인스턴스나 쿼리셋으로 변환할 수 있습니다.

왜 이런 작업들이 필요할까요? DRF에서는 데이터를 저장할 때 Django의 Model을 통해 저장하게 됩니다. Django의 모델은 ORM으로 처리할 수 있는 **”파이썬 객체”**이며 클라이언트는 파이썬 객체를 해석할 수 없습니다.

그래서 JSON, XML과 같은 클라이언트 측에서 읽을 수 있는 문자열로 변환하여 보내주어야 하고 이때 변환하는 작업을 Serialize(직렬화)라고 합니다. 반대로 JSON, XML 등의 문자열을 파이썬 객체로 변환하는 작업을 Deserialize(역 직렬화)라고 합니다. DRF의 serialize에서는 직렬화, 역 직렬화 기능을 모두 갖추고 있습니다.

class UserSerializer(serializers.Serializer):
    email = serializers.EmailField()
    name = serializers.CharField(max_length=20)
		created = serializers.DateTimeField()

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

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.name = validated_data.get('content', instance.content)
        instance.created = validated_data.get('created', instance.created)
        return instance

View (뷰)

Django REST Framework에서는 기본적으로 함수 기반 뷰(Function Based View)와 클래스 기반 뷰(Class Based View)를 지원합니다. 뷰는 HTTP 요청을 받아서 데이터를 처리하고, HTTP 응답을 반환하는 역할을 합니다.

함수 기반 뷰(Function Based View)

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['POST'])
def create_user(request):
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=400)

클래스 기반 뷰(Class Based View)

from rest_framework.views import APIView
from rest_framework.response import Response

class UserAPIView(APIView):
    def post(self, request, format=None):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

Router (라우터)