Nonamed Develog
[TIL][240830] APIView, GenericAPIView, Mixin, ViewSet 본문
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을 작성해봐야겠다.
'WHAT I LEARN > TIL' 카테고리의 다른 글
[TIL][240903] RESTful API (1) | 2024.09.03 |
---|---|
[TIL][240902] 장고 기초 이해도 테스트 오답 노트 (0) | 2024.09.02 |
[TIL][240829] RESTful API, DRF 기초 (0) | 2024.08.29 |
[TIL][240823] HTML 드롭다운 선택 문제 해결 (0) | 2024.08.23 |
[TIL][240822] 프로필 이미지 반응형으로 변경하기 (0) | 2024.08.22 |