- Published on
Django CBV vs FBV — 클래스형 뷰와 함수형 뷰 비교
- Authors

- Name
- Hyo814
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 목록
| 뷰 클래스 | 주요 속성/메서드 | 용도 |
|---|---|---|
TemplateView | template_name, get_context_data() | 단순 템플릿 렌더링 |
ListView | model, queryset, paginate_by | 목록 페이지 |
DetailView | model, pk_url_kwarg | 상세 페이지 |
CreateView | form_class, success_url, form_valid() | 생성 폼 |
UpdateView | form_class, success_url, form_valid() | 수정 폼 |
DeleteView | success_url | 삭제 확인 |
LoginView | form_class, redirect_field_name | 로그인 |
PasswordChangeView | success_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 비교
| 항목 | FBV | CBV |
|---|---|---|
| 코드 가독성 | 직관적, 위에서 아래로 읽힘 | 제네릭 뷰 구조 이해 필요 |
| 코드 양 | 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로 작성하는 경우가 많습니다.