Class Based View (CBV)
Django와 Django REST Framework(DRF)에서 View를 작성하는 두 가지 방식
- FBV (Function Based View): 함수로 처리
- CBV (Class Based View): 클래스로 처리
CBV의 장점
HTTP 메서드별 처리(get(), post(), put(), delete() 등)를 메서드 단위로 분리할 수 있어 가독성과 유지보수성이 높아짐
클래스 기반이라 공통 로직을 재사용하기 좋고, 확장성이 뛰어남
DRF는 CBV를 더 쉽게 쓰기 위한 기본 클래스를 제공
CBV 클래스 종류 (DRF 기준)
APIView | CBV의 기본 클래스 - 직접 메서드 정의 필요 |
GenericAPIView | APIView 기반 + 쿼리셋, 직렬화 등 기본 기능 내장 |
Mixin 계열 | GenericAPIView에 조합해서 사용, 재사용 가능한 기능들 (예: ListModelMixin, CreateModelMixin) |
ViewSet | URL 구조까지 자동화된 CBV(여러 엔드포인트를 한 번에 관리 가능), RESTful API 구현에 매우 효율적 |
처음에는 APIView부터 사용해보고, 필요에 따라 GenericAPIView, ViewSet으로 확장
FBV → CBV
ArticleListAPIView (목록 조회 + 생성)
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer
class ArticleListAPIView(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
def post(self, request):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
get() → 전체 게시글 목록 반환
post() → 새 게시글 생성
urls.py
from django.urls import path
from . import views
app_name = "articles"
urlpatterns = [
path("", views.ArticleListAPIView.as_view(), name="article_list"),
]
CBV에서는 .as_view() 메서드를 통해 클래스를 URL에 연결
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 delete(self, request, pk):
article = self.get_object(pk)
article.delete()
return Response(
{"delete": f"Article({pk}) is deleted."}, status=status.HTTP_200_OK
)
def put(self, request, pk):
article = self.get_object(pk)
serializer = ArticleSerializer(article, data=request.data, partial=False)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def patch(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)
get_object()로 중복되는 객체 조회 로직을 분리하여 재사용
get() → 특정 게시글 조회
delete() → 게시글 삭제
put() → 게시글 전체 수정
patch() → 게시글 일부 수정
urls.py
urlpatterns = [
path("", views.ArticleListAPIView.as_view(), name="article_list"),
path("<int:pk>/", views.ArticleDetailAPIView.as_view(), name="article_detail"),
]
간단한 뷰는 FBV로, 복잡하거나 반복되는 로직은 CBV로 작성하면 좋음
'∟ Framework > ∟ DRF' 카테고리의 다른 글
DRF Serializer 활용 (1) | 2025.03.30 |
---|---|
DRF models with relationship CRUD API 구현 (0) | 2025.03.30 |
DRF Single Model CRUD API 구현 (0) | 2025.03.29 |
Django REST Framework(DRF) API 구현 (0) | 2025.03.29 |
JSON Response와 Serialization (0) | 2025.03.29 |