CBV(Class-Based Views)

유정원·2024년 8월 30일

python

목록 보기
9/21

CBVClass-Based Views의 약자로, Django에서 제공하는 뷰(View)를 정의하는 방법 중 하나입니다. Django의 뷰는 두 가지 방식으로 정의할 수 있는데, 하나는 함수 기반 뷰(Function-Based Views, FBV)이고, 다른 하나는 클래스 기반 뷰(Class-Based Views, CBV)입니다.

CBV의 개념

클래스 기반 뷰는 뷰를 클래스 형태로 정의하여, 뷰 로직을 다양한 메서드로 나눌 수 있게 합니다. 이는 코드의 재사용성과 유지보수성을 높이며, Django에서 제공하는 여러 믹스인(mixin)과 제네릭 뷰(generic view)를 활용할 수 있게 합니다.

장점

  1. 재사용성: CBV는 코드의 재사용성을 높여줍니다. 여러 뷰에서 공통적으로 사용하는 로직을 쉽게 추출하여 부모 클래스나 믹스인으로 만들 수 있습니다.

  2. 구조화: 뷰 로직을 여러 메서드로 분리할 수 있어, 각 요청 메서드(GET, POST 등)에 대해 별도의 메서드를 정의할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.

  3. 제네릭 뷰: Django는 여러 가지 제네릭 뷰를 제공하여 CRUD 작업을 쉽게 처리할 수 있습니다. 예를 들어, 리스트 뷰, 디테일 뷰, 생성 뷰, 업데이트 뷰, 삭제 뷰 등이 있습니다.

CBV 예시

아래는 CBV를 사용하여 간단한 뷰를 정의하는 예시입니다.

모델 예시

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

리스트 뷰 (ListView)

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'
  • ListView: Django의 제네릭 뷰 중 하나로, 특정 모델의 객체 리스트를 보여줍니다.
  • model: 리스트에 표시할 모델을 지정합니다.
  • template_name: 렌더링할 템플릿 파일을 지정합니다.
  • context_object_name: 템플릿에서 사용할 컨텍스트 변수명을 지정합니다.

디테일 뷰 (DetailView)

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'
  • DetailView: 특정 모델 인스턴스의 세부 정보를 보여주는 제네릭 뷰입니다.

생성 뷰 (CreateView)

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')
  • CreateView: 새로운 모델 인스턴스를 생성하기 위한 제네릭 뷰입니다.
  • fields: 생성 폼에서 사용할 모델 필드를 지정합니다.
  • success_url: 객체 생성 후 리다이렉트할 URL을 지정합니다.

업데이트 뷰 (UpdateView)

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')
  • UpdateView: 기존 모델 인스턴스를 업데이트하는 제네릭 뷰입니다.

삭제 뷰 (DeleteView)

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')
  • DeleteView: 모델 인스턴스를 삭제하기 위한 제네릭 뷰입니다.

CBV vs FBV

  • FBV(Function-Based Views): 함수로 뷰를 정의하며, 단순한 로직의 경우 빠르게 작성할 수 있습니다. 그러나 복잡한 뷰 로직이나 공통 로직이 많아질 경우, 코드의 중복이 늘어나고 관리가 어려워질 수 있습니다.

  • CBV(Class-Based Views): 코드 재사용과 확장이 쉽고, Django의 다양한 믹스인과 제네릭 뷰를 활용할 수 있습니다. 하지만, 구조가 복잡해지기 때문에 CBV를 처음 접하는 경우 다소 학습 곡선이 있을 수 있습니다.

결론

CBV는 Django에서 보다 구조화되고 재사용 가능한 코드를 작성할 수 있게 해주는 강력한 도구입니다. 제네릭 뷰를 사용하면 반복적인 CRUD 작업을 쉽게 처리할 수 있으며, 복잡한 뷰 로직을 메서드로 나누어 가독성과 유지보수성을 높일 수 있습니다.

0개의 댓글