Class Based View (CBV)

chanloper·2024년 9월 2일

Django

목록 보기
5/8

Django의 View는 두 가지 방식으로 작성할 수 있다.

  • 함수형 뷰 (Function Based View, FBV)
  • 클래스형 뷰 (Class Based View, CBV)

DRF 역시 두 가지 방식으로 View 형태로 작성이 가능하다.

Class Based View의 특징

  • 클래스형 뷰에서는 특정 Http Method에 대한 처리를 함수로 분리할 수 있게 된다.
    ( GET요청에 대한 처리는 get() , POST요청에 대한 처리는 post()에서 정의가 가능해진다.
  • 클래스를 사용하기 때문에 코드의 재사용성과 유지보수성이 향상된다.
  • 기본 APIView 이외에도 편의를 제공하는 다양한 내장 CBV가 존재한다.

APIView

  • APIView - DRF CBV의 베이스 클래스

  • GenericAPIView - 일반적인 API 작성을 위한 기능이 포함된 클래스
    보통 CRUD 기능이 대부분인 상황을 위해 여러가지 기능이 미리 내장되어 있다.

FBV

# 함수형 View 형태

@api_view(["GET", "POST"])
def article_list(request):
     if request.method == "GET":
         articles = Article.objects.all()
         serializer = ArticleSerializer(articles, many=True)
         return Response(serializer.data)

     elif request.method == "POST":
         serializer = ArticleSerializer(data=request.data)
          return Response(serializer.errors, status=400)
          if serializer.is_valid(raise_exception=True):
             serializer.save()
             return Response(serializer.data, status=status.HTTP_201_CREATED)

CBV


# 클래스형 View 형태

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)
        # return Response(serializer.errors, status=400)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
urlpatterns = [
    path("", views.ArticleListAPIView.as_view(), name="article_list"),
    path("<int:pk>/", views.ArticleDetailAPIView.as_view(), name="article_detail"),
]

class형 View 사용 시 urls.py에서 .as_view()로 수정해줘야 한다.

FBV와 CBV중 무엇을 사용해도 괜찮지만, CBV를 구조적으로 잘 사용할 경우 코드의 재사용성과 유지 보수성이 향상되는 것이 눈에 보이게 된다.
간단한 로직은 FBV로 작성하여도 충분하다.

profile
이것 뭐에요?

0개의 댓글