Django의 View는 두 가지 방식으로 작성할 수 있다.
DRF 역시 두 가지 방식으로 View 형태로 작성이 가능하다.
Class Based View의 특징
get() , POST요청에 대한 처리는 post()에서 정의가 가능해진다.APIView - DRF CBV의 베이스 클래스
GenericAPIView - 일반적인 API 작성을 위한 기능이 포함된 클래스
보통 CRUD 기능이 대부분인 상황을 위해 여러가지 기능이 미리 내장되어 있다.
# 함수형 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)
# 클래스형 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로 작성하여도 충분하다.