Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240830] APIView, GenericAPIView, Mixin, ViewSet 본문

WHAT I LEARN/TIL

[TIL][240830] APIView, GenericAPIView, Mixin, ViewSet

노네임드개발자 2024. 8. 30. 18:50

APIView

APIView는 Django REST Framework(DRF)에서 RESTful API를 구현할 때 사용되는 Class-based View의 기본 클래스이다. 각 HTTP 메서드(GET, PUT, POST, DELETE 등)에 대한 로직을 직접 오버라이딩하여 쉽게 구현할 수 있다. get_object와 같은 헬퍼 메서드를 통해 객체를 가져오고, 이를 직렬화(Serializtion) 한 후, Response로 반환하는 방식이 기본적인 패턴이다. 아래 코드는 강의에서 작성한 ArticleDetailAPIView이다.

class ArticleDetailAPIView(APIView):

    def get_object(self, pk):
        return get_object_or_404(Article, pk=pk)

    def get(self, request, pk):
        article = self.get_object(pk)
        serializer = ArticleSerializer(article)
        return Response(serializer.data)

    def put(self, request, pk):
        article = self.get_object(pk)
        serializer = ArticleSerializer(article, data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data)

    def delete(self, request, pk):
        article = self.get_object(pk)
        article.delete()
        data = {"pk": f"{pk} is deleted."}
        return Response(data, status=status.HTTP_200_OK)

 

공식 문서에 따르면 APIView는 기존 View 클래스를 확장한 것으로, RESTful API를 구축하기 위해 필요한 여러 기능을 추가로 제공한다. 예를 들어 request 객체는 Django의 HttpRequest 대신 DRF의 Request 객체를 사용하며, JSON 데이터 처리나 파일 업로드와 같은 기능을 쉽게 다룰 수 있다.

 

2. GenericAPIView & Mixin

GenericAPIView

APIView의 확장판 격으로 보다 효율적인 API 작성을 위한 기능들을 포함한다. 예를 들어 queryset과 serializer_class를 설정해 두면, 이 것들을 자동으로 처리하는 다양한 Mixin과 함께 사용할 수 있고 냄새나는 코드(반복되는 코드)를 줄일 수 있다.

 

GenericAPIView with Mixin

GernericAPIView는 다양한 Mixin과 함께 사용하여 CRUD 기능을 쉽게 구현할 수 있다.

  • RetrieveModelMixin
    retrieve() 메서드를 제공하여 단일 객체의 데이터를 조회할 수 있다. get() 메서드에서 이를 호출하면, 주어진 pk에 해당하는 객체를 자동으로 검색하고, 직렬화하려 반환한다.
  • UpdateModelMixin
    update() 메서드와 parial_update() 메서드를 제공하여 객체의 데이터를 수정할 수 있다. put() 메서드에서 호출하면 전체 객체를 업데이트할 수 있고, partial=True 옵션을 사용하면 부분 업데이트도 가능하다.
  • DestoryModelMixin
    destory() 메서드를 제공하여 객체를 삭제할 수 있다. delete() 메서드에서 호출하면, 주어진 pk에 해당하는 객체를 데이터베이스에서 삭제하고, 성공적으로 삭제되었다는 응답을 반환한다.

GenericAPIView와 Mixin을 활용한 코드는 아래와 같다.

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

class ArticleDetailAPIView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

 

이 코드에서 GenericAPIView를 기반으로 Mixin을 사용해 get, put, delete 메서드를 구현했다. 더 이상 get_object와 같은 헬퍼 메서드를 작성할 필요가 없고 코드가 훨씬 간결해졌다.

 

공식문서에 따르면 GeneticAPIView는 queryset과 serializer_class와 같은 속성을 통해 데이터베이스 조회 및 직렬화 작업을 처리하는 데 유용하다. 또한, 다양한 Mixin과 조합하여 CRUD 작업을 쉽게 구현할 수 있어 반복되는 코드를 최소화할 수 있다.

 

 

또한 그림과 같이 ViewSet이라고 여러개의 엔트포인트를 하나의 클래스에서 관리할 수 있는 방법으로 코드의 중복을 줄이고 유지보수를 용이하게 만들 수 있다는데, 나중에 다시 정리해봐야곘다. 그리고 과제를 할 때 APIView 뿐만 아니라 GenericAPIView와 Mixin을 활용하여 연습을 하고 추가 TIL을 작성해봐야겠다.