CBV는 Class-Based Views의 약자로, Django에서 제공하는 뷰(View)를 정의하는 방법 중 하나입니다. Django의 뷰는 두 가지 방식으로 정의할 수 있는데, 하나는 함수 기반 뷰(Function-Based Views, FBV)이고, 다른 하나는 클래스 기반 뷰(Class-Based Views, CBV)입니다.
클래스 기반 뷰는 뷰를 클래스 형태로 정의하여, 뷰 로직을 다양한 메서드로 나눌 수 있게 합니다. 이는 코드의 재사용성과 유지보수성을 높이며, Django에서 제공하는 여러 믹스인(mixin)과 제네릭 뷰(generic view)를 활용할 수 있게 합니다.
재사용성: CBV는 코드의 재사용성을 높여줍니다. 여러 뷰에서 공통적으로 사용하는 로직을 쉽게 추출하여 부모 클래스나 믹스인으로 만들 수 있습니다.
구조화: 뷰 로직을 여러 메서드로 분리할 수 있어, 각 요청 메서드(GET, POST 등)에 대해 별도의 메서드를 정의할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.
제네릭 뷰: Django는 여러 가지 제네릭 뷰를 제공하여 CRUD 작업을 쉽게 처리할 수 있습니다. 예를 들어, 리스트 뷰, 디테일 뷰, 생성 뷰, 업데이트 뷰, 삭제 뷰 등이 있습니다.
아래는 CBV를 사용하여 간단한 뷰를 정의하는 예시입니다.
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
from django.views.generic import ListView
from myapp.models import MyModel
class MyModelListView(ListView):
model = MyModel
template_name = 'mymodel_list.html'
context_object_name = 'mymodels'
model: 리스트에 표시할 모델을 지정합니다.template_name: 렌더링할 템플릿 파일을 지정합니다.context_object_name: 템플릿에서 사용할 컨텍스트 변수명을 지정합니다.from django.views.generic import DetailView
from myapp.models import MyModel
class MyModelDetailView(DetailView):
model = MyModel
template_name = 'mymodel_detail.html'
context_object_name = 'mymodel'
from django.views.generic import CreateView
from myapp.models import MyModel
from django.urls import reverse_lazy
class MyModelCreateView(CreateView):
model = MyModel
template_name = 'mymodel_form.html'
fields = ['name', 'age']
success_url = reverse_lazy('mymodel-list')
fields: 생성 폼에서 사용할 모델 필드를 지정합니다.success_url: 객체 생성 후 리다이렉트할 URL을 지정합니다.from django.views.generic import UpdateView
from myapp.models import MyModel
from django.urls import reverse_lazy
class MyModelUpdateView(UpdateView):
model = MyModel
template_name = 'mymodel_form.html'
fields = ['name', 'age']
success_url = reverse_lazy('mymodel-list')
from django.views.generic import DeleteView
from myapp.models import MyModel
from django.urls import reverse_lazy
class MyModelDeleteView(DeleteView):
model = MyModel
template_name = 'mymodel_confirm_delete.html'
success_url = reverse_lazy('mymodel-list')
FBV(Function-Based Views): 함수로 뷰를 정의하며, 단순한 로직의 경우 빠르게 작성할 수 있습니다. 그러나 복잡한 뷰 로직이나 공통 로직이 많아질 경우, 코드의 중복이 늘어나고 관리가 어려워질 수 있습니다.
CBV(Class-Based Views): 코드 재사용과 확장이 쉽고, Django의 다양한 믹스인과 제네릭 뷰를 활용할 수 있습니다. 하지만, 구조가 복잡해지기 때문에 CBV를 처음 접하는 경우 다소 학습 곡선이 있을 수 있습니다.
CBV는 Django에서 보다 구조화되고 재사용 가능한 코드를 작성할 수 있게 해주는 강력한 도구입니다. 제네릭 뷰를 사용하면 반복적인 CRUD 작업을 쉽게 처리할 수 있으며, 복잡한 뷰 로직을 메서드로 나누어 가독성과 유지보수성을 높일 수 있습니다.