[Django] 클래스형 뷰를 통한 체계적인 뷰 만들기
참고 자료 : https://docs.djangoproject.com/en/5.0/topics/class-based-views/intro/
클래스형 뷰(Class-based views)란?
장고에서 뷰를 만들 때 클래스 기반 뷰(Class-Based Views, CBVs)를 사용하는 것은 함수 기반 뷰(Function-Based Views, FBVs)에 비해 몇 가지 장점이 있습니다. 간단하게 설명하자면 더 크고 복잡한 어플리케이션을 만드는 과정에서 코드의 재사용성 및 가독성을 높이고 테스트를 용이하게 하려면 클래스 기반 뷰가 더 좋습니다. 먼저 클래스형 뷰 사용법에 대해 설명하겠습니다.
클래스형 뷰 사용하기
urls.py - as_view()메서드
views.py에서 클래스형 뷰를 만든다면 이 클래스에 접속하기 위해 장고에서 제공하는 as_view()메서드를 활용하게 됩니다.
# urls.py TemplateView 사용 시
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path("about/", TemplateView.as_view(template_name="about.html")),
]
# urls.py View 사용 시
from django.urls import path
from myapp.views import MyView
urlpatterns=[
path('about/', MyView.as_view()),
]
views.py
# views.py TemplateView 사용 시
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
#views.py View 사용 시
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request):
#view logic
return HttpResponse('result')
클래스형 뷰 장점
위에서 간단하게 클래스형 뷰를 사용하는 방법을 알아보았습니다. 이런 클래스형 뷰 장점에 대해 설명하겠습니다.
Method 구분
클래스형 뷰를 사용하지 않는 경우
from django.http import HttpResponse
def my_view(request):
if request.method == "GET":
# <view logic>
return HttpResponse("result")
클래스형 뷰를 사용하는 경우
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
# <view logic>
return HttpResponse("result")
위와 같이 get, post 등의 method를 구분하기 위해 기존에는 if문을 사용해야 했지만, 클래스형 뷰를 사용하면 함수명에 get, post를 넣어서 더욱 쉽게 관리할 수 있습니다.
상속
from django.http import HttpResponse
from django.views import View
class GreetingView(View):
greeting = "Good Day"
def get(self, request):
return HttpResponse(self.greeting)
위 클래스형 뷰를 상속받을 수 있습니다.
class MorningGreetingView(GreetingView):
greeting = "Morning to ya"
혹은 다음과 같은 방식을 사용해 상속을 구현할 수도 있습니다.
urlpatterns = [
path("about/", GreetingView.as_view(greeting="G'day")),
]