📘 DRF 


Class Based View (CBV)

클래스형 view (CBV)에 대해 알아보자

 

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

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

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


Class Based View 특징

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

 

Class Based View 종류

  • APIView
    • DRF CBV의 베이스 클래스
  • GenericAPIView
    • 일반적인 API 작성을 위한 기능이 포함된 클래스
    • 보통 CRUD 기능이 대부분인 상황을 위해 여러 가지 기능이 미리 내장되어 있다.
  • Mixin
    • 재사용 가능한 여러 가지 기능을 담고 있는 클래스
    • 말 그대로 여러 클래스를 섞어서 사용하기 위한 클래스
      • ListModelMixin - 리스트 반환 API를 만들기 위해 상속받는 클래스
      • CreateModelMixin - 새로운 객체를 생성하는 API를 만들기위해 상속받는 클래스
    • ViewSets
      • 여러 엔드포인트(endpoint)를 한 번에 관리할 수 있는 클래스
      • RESTful API에서 반복되는 구조를 더 편리하게 작성할 수 있는 방법을 제공한다.

CBV 사용해보기

articles/urls.py
  • CBV를 사용할 때는 참조하는 형식이 변경된다.
  • as_view() 메서드를 사용해서 URL 패턴에 연결한다.
    • → 클래스 자체를 넘기는 것이 아니라 as_view() 메서드를 사용해서 호출 가능한 함수로 변환
더보기
변경 전

⬇️

변경 후
path("", views.ArticleListAPIView.as_view()),
articles/views.py/ArticleListAPIView
더보기
class ArticleListAPIView(APIView):  # GET, POST만 정의돼 있어서 그 외의 method엔 작동 X
    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) # data에 POST 데이터를 넣어줘요
        if serializer.is_valid(raise_exception=True): # 만약 serializer 값이 유효하고, 예외 발생 True
            serializer.save() # article 생성
            return Response(serializer.data, status=201) # api 201(created)를 반환

 

articles/urls.py
더보기
path("<int:pk>/", views.ArticleDetailAPIView.as_view()),

 

articles/views.py/ArticleDetailAPIView
더보기
class ArticleDetailAPIView(APIView):
    def get(self, request, pk):
        article = get_object_or_404(Article, pk=pk) # 없는 pk 값을 불렀을 때, 404 화면이 뜨도록
        serializer = ArticleSerializer(article)
        return Response(serializer.data)
    
    def put(self, request, pk):
        article = get_object_or_404(Article, pk=pk) # 조회한 article
        serializer = ArticleSerializer(article, data=request.data, partial=True) # article에 입력한 data를 넣고, 개별 변경 가능
        if serializer.is_valid(raise_exception=True): # 만약 serializer 값이 유효하다면, 예외 발생 True
            serializer.save() # 저장하고 수정.
            return Response(serializer.data) # 그 수정된 값을 반환
    
    def delete(self, request, pk):
        article = get_object_or_404(Article, pk=pk)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

'공부 > DRF 공부' 카테고리의 다른 글

[DRF] Serializer 활용하기  (1) 2025.01.31
[DRF] Relationship과 DRF, 댓글 생성  (0) 2025.01.30
[DRF] DRF Single Model CRUD  (0) 2025.01.30
[DRF] Django REST Framework 시작하기, Postman  (0) 2025.01.28
[DRF] Response와 Serializer  (0) 2025.01.28

+ Recent posts