∟ Framework/∟ DRF

Class Based View (CBV)

최 수빈 2025. 3. 29. 19:48

 

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