Published on

Django CBV vs FBV — 클래스형 뷰와 함수형 뷰 비교

Authors
  • avatar
    Name
    Hyo814
    Twitter

Django CBV vs FBV — 클래스형 뷰와 함수형 뷰 비교

Django는 MTV(Model-Template-View) 패턴을 기반으로 하며, View는 두 가지 방식으로 작성할 수 있습니다:

  • FBV (Function-Based View): 함수로 뷰를 작성
  • CBV (Class-Based View): 클래스로 뷰를 작성

FBV — 함수형 뷰

from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
from .forms import PostForm

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'post_detail.html', {'post': post})

def post_create(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('post_list')
    else:
        form = PostForm()
    return render(request, 'post_form.html', {'form': form})
  • HTTP 메서드(GET, POST)를 if로 직접 분기
  • 코드 흐름이 한눈에 보임
  • 커스터마이징이 자유로움

CBV — 클래스형 뷰

Django가 제공하는 제네릭 뷰를 상속해서 사용합니다.

from django.views.generic import DetailView, CreateView
from django.urls import reverse_lazy
from .models import Post
from .forms import PostForm

class PostDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'

class PostCreateView(CreateView):
    model = Post
    form_class = PostForm
    template_name = 'post_form.html'
    success_url = reverse_lazy('post_list')
  • CRUD 패턴을 몇 줄로 구현 가능
  • 상속과 Mixin으로 코드 재사용
  • 내부 동작을 이해해야 커스터마이징 가능

주요 제네릭 CBV 목록

뷰 클래스주요 속성/메서드용도
TemplateViewtemplate_name, get_context_data()단순 템플릿 렌더링
ListViewmodel, queryset, paginate_by목록 페이지
DetailViewmodel, pk_url_kwarg상세 페이지
CreateViewform_class, success_url, form_valid()생성 폼
UpdateViewform_class, success_url, form_valid()수정 폼
DeleteViewsuccess_url삭제 확인
LoginViewform_class, redirect_field_name로그인
PasswordChangeViewsuccess_url비밀번호 변경

각 CBV의 상세 속성은 ccbv.co.uk 에서 확인할 수 있습니다.


메서드 오버라이드 패턴

CBV는 필요한 메서드만 오버라이드해서 동작을 바꿉니다.

class PostCreateView(CreateView):
    model = Post
    form_class = PostForm
    success_url = reverse_lazy('post_list')

    def form_valid(self, form):
        # 저장 전 작성자를 현재 로그인 유저로 지정
        form.instance.author = self.request.user
        return super().form_valid(form)

    def get_context_data(self, **kwargs):
        # 템플릿에 추가 컨텍스트 전달
        context = super().get_context_data(**kwargs)
        context['title'] = '새 글 작성'
        return context

FBV vs CBV 비교

항목FBVCBV
코드 가독성직관적, 위에서 아래로 읽힘제네릭 뷰 구조 이해 필요
코드 양CRUD 패턴 반복 많음제네릭 활용 시 매우 짧음
커스터마이징자유도 높음메서드 오버라이드 방식
재사용성낮음 (헬퍼 함수 별도 구성)Mixin으로 높은 재사용성
학습 난이도낮음상대적으로 높음
HTTP 메서드 분기if request.method == 'POST'get(), post() 자동 분리

언제 무엇을 쓸까?

FBV가 적합한 경우

  • 단순하고 일회성인 뷰 (API 연동, 특수 리다이렉트 등)
  • 복잡한 조건 분기가 많은 뷰
  • Django를 처음 배우는 시점

CBV가 적합한 경우

  • CRUD 패턴이 반복되는 뷰가 많을 때
  • 여러 뷰에서 공통 로직을 Mixin으로 묶고 싶을 때
  • LoginRequiredMixin, PermissionRequiredMixin 등 내장 Mixin을 활용할 때
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin

class PostCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
    permission_required = 'blog.add_post'
    model = Post
    form_class = PostForm
    success_url = reverse_lazy('post_list')

FBV에서 같은 처리를 하려면 데코레이터를 직접 쌓아야 합니다:

from django.contrib.auth.decorators import login_required, permission_required

@login_required
@permission_required('blog.add_post')
def post_create(request):
    ...

정리

FBV와 CBV는 둘 다 유효한 선택이며, 하나의 프로젝트에서 혼용해도 괜찮습니다.

  • FBV: 읽기 쉽고 빠르게 작성 가능. 복잡한 로직에 강함.
  • CBV: 반복 패턴 제거에 강함. Mixin 조합으로 확장성 좋음.

실무에서는 단순 CRUD는 CBV로, 비즈니스 로직이 복잡한 뷰는 FBV로 작성하는 경우가 많습니다.