📘 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()
- → 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 |