Project/Team22

[Team 22] Django REST framework (3) - Viewset

mingyung 2024. 2. 3. 20:25

오늘은 DRF의 view set에 대해서 알아본다. 

이미 알고있듯이 View는 API엔드포인트에서 수행되는 동작들을 정의하는 곳이다.

따라서 특정 엔드포인트에 대한 요청을 받아 처리하고, 응답을 생성해 반환한다. 

 

뷰를 작성하는데에는 세가지의 방식이 있고, 이는 각각 함수기반 뷰, 클래스 기반 뷰로 나뉜다.

#함수 기반 뷰
from django.http import HttpResponse

def my_view(request):
    return HttpResponse("Hello, World!")


# 클래스 기반 뷰
from django.views import View
from django.http import HttpResponse

class MyView(View):
    def get(self, request):
        return HttpResponse("Hello, World!")

 

뷰는 URL패턴과 매핑되어서 특정 URL에 대한 요청을 처리한다. 또한 request 객체를 받아 response객체를 반환한다.

 

 

뷰셋의 경우에는 DRF에서 등장한 개념으로, DRF에서 데이터의 CRUD작업을 수행하는 API앤드포인트의 비즈니스 로직을 정의하는데에 사용된다. 주로 장고의 모델과 연결되어 DB와 상호작용하게 된다.

이런 뷰셋 또한 함수 기반과 클래스기반으로 나누어진다.

 

# 함수기반
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def my_viewset(request):
    # 로직 수행
    data = {'message': 'Hello, World!'}
    return Response(data)



# 클래스 기반
from rest_framework.views import APIView
from rest_framework.response import Response

class MyViewSet(APIView):
    def get(self, request):
        # 로직 수행
        data = {'message': 'Hello, World!'}
        return Response(data)
        
# ModelViewSet사용
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework import status
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelViewSet(ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

    def custom_action(self, request):
        # 사용자 정의 액션에 대한 로직
        return Response({'message': '사용자 정의 액션 처리'}, status=status.HTTP_200_OK)

 

뷰셋은 APIView클래스를 상속받아 구현되고, 각 HTTP메서드(GET, POST, PUT, DELETE ...)에 대한 로직을 구현한다.

함수기반보다는 클래스기반 뷰의 일종으로 보아 클래스 기반 형태로 작성한다.

 

이미 DRF에서는 API개발을 지원하기 위해서 미리 정의된 뷰셋들을 지원하고 있다. 

대표적으로 ViewSet, ModelViewSet, ReadOnlyModelViewSet등이 있고, ModelViewSet은 List, Create, Retrieve, Update, Destroy등의 기본적인 API엔드포인트를 제공한다.