Post

Django의 CBV(Class-Based View)

Django의 Class-Based View(CBV)를 활용한 구조적이고 재사용 가능한 웹 애플리케이션 개발 가이드.

Django의 CBV(Class-Based View)

Django의 CBV(Class-Based View)란 무엇인가?

Django에서 제공하는 CBV(Class-Based View)는 Python의 클래스 개념을 활용하여 뷰를 정의하는 방식입니다. 기존의 함수 기반 뷰(Function-Based View, FBV)에 비해 구조적이고 재사용성이 높은 코드를 작성할 수 있도록 도와줍니다.

CBV의 장점

  1. 구조화된 코드: 클래스 단위로 뷰를 작성하므로, 관련된 로직을 한곳에 모아 관리하기 쉽습니다.
  2. 코드 재사용성: Django에서 제공하는 제네릭 클래스 뷰(예: ListView, DetailView 등)를 사용하여 반복적인 코드를 줄일 수 있습니다.
  3. Mixin 활용: 다양한 Mixin 클래스를 조합하여 확장 가능한 뷰를 작성할 수 있습니다.
  4. 명확한 역할 분리: 메서드를 기반으로 요청(GET, POST 등) 처리 로직을 명확하게 분리할 수 있습니다.

FBV와 CBV의 비교

FBVCBV
함수로 작성됨클래스로 작성됨
간단한 로직에 적합복잡한 로직에 적합
코드가 길어질 수 있음재사용성과 구조화된 코드 제공
요청 메서드(GET, POST 등)를 조건문으로 처리각 메서드로 요청 처리

CBV의 기본 구조

CBV는 View 클래스를 상속받아 작성하며, 주요 HTTP 메서드(GET, POST 등)에 대응하는 메서드를 오버라이딩하여 동작을 정의합니다.

기본 CBV 예제

1
2
3
4
5
6
7
8
9
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        return HttpResponse('This is a GET request.')

    def post(self, request):
        return HttpResponse('This is a POST request.')

URLconf 연결

1
2
3
4
5
6
from django.urls import path
from .views import MyView

urlpatterns = [
    path('my-view/', MyView.as_view(), name='my_view'),
]

제네릭 클래스 뷰(Generic Class-Based Views)

Django는 반복적으로 사용되는 뷰 로직을 간편하게 처리할 수 있도록 제네릭 클래스 뷰를 제공합니다. 제네릭 클래스 뷰는 데이터베이스와 연동하여 CRUD(Create, Read, Update, Delete) 작업을 쉽게 구현할 수 있습니다.

주요 제네릭 클래스 뷰

  1. ListView: 객체 리스트를 출력.
  2. DetailView: 특정 객체의 상세 정보 출력.
  3. CreateView: 새로운 객체 생성.
  4. UpdateView: 기존 객체 수정.
  5. DeleteView: 기존 객체 삭제.

제네릭 클래스 뷰 예제: 게시글 리스트

1
2
3
4
5
6
7
from django.views.generic import ListView
from .models import Post

class PostListView(ListView):
    model = Post
    template_name = 'posts/post_list.html'
    context_object_name = 'posts'

URLconf 연결

1
2
3
4
5
6
from django.urls import path
from .views import PostListView

urlpatterns = [
    path('posts/', PostListView.as_view(), name='post_list'),
]

템플릿 예제

templates/posts/post_list.html

1
2
3
4
5
6
7
8
<h1>게시글 목록</h1>
<ul>
    {% for post in posts %}
        <li>{{ post.title }}</li>
    {% endfor %}
</ul>

Mixin 활용

CBV에서 Mixin은 뷰의 기능을 확장하거나 조합할 때 유용합니다. Django는 인증, 권한 검사 등의 기능을 제공하는 여러 Mixin 클래스를 지원합니다.

LoginRequiredMixin 예제

1
2
3
4
5
6
7
8
9
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from .models import Post

class PostListView(LoginRequiredMixin, ListView):
    model = Post
    template_name = 'posts/post_list.html'
    context_object_name = 'posts'
    login_url = '/accounts/login/'

CBV 사용 시 주의점

  1. 복잡성 증가: 단순한 로직에서는 CBV가 오히려 코드를 복잡하게 만들 수 있습니다.
  2. Mixin 순서: 다중 상속 시 Mixin의 순서에 따라 동작이 달라질 수 있으므로 주의해야 합니다.
  3. 제네릭 클래스 뷰의 제한: 기본 동작이 특정한 요구사항에 맞지 않을 경우, 메서드를 오버라이딩하거나 새 클래스를 작성해야 할 수 있습니다.

CBV로 전환할 때 고려할 점

  1. 프로젝트 규모: 프로젝트가 클수록 CBV가 유리할 수 있습니다.
  2. 팀의 코드 스타일: 팀원이 CBV에 익숙하지 않다면 FBV가 더 나을 수 있습니다.
  3. 기존 코드와의 호환성: 기존 FBV 코드와 혼합하여 사용할 때 유지보수를 고려해야 합니다.

결론

Django의 CBV는 재사용성과 유지보수를 크게 향상시키는 강력한 도구입니다. 특히 CRUD 작업이나 인증과 같은 반복적인 작업에서는 제네릭 클래스 뷰와 Mixin을 적극 활용하여 생산성을 높일 수 있습니다. 그러나 단순한 로직에서는 FBV가 더 적합할 수 있으므로, 상황에 맞게 FBV와 CBV를 조합하여 사용하는 것이 좋습니다.

This post is licensed under CC BY 4.0 by the author.