기술블로그-Django편
📌 Django CBV의 핵심 원리: as_view()와 dispatch() 완전 이해하기
Chansman
2025. 5. 8. 11:05
📌 Django CBV의 핵심 원리: as_view()와 dispatch() 완전 이해하기
✅ 1. CBV는 왜 .as_view()를 붙일까?
Django에서 클래스 기반 뷰(Class-Based View, CBV)는 단순히 클래스를 정의한 것만으로는 URL에 연결할 수 없습니다.
# ❌ 이렇게 쓰면 오류 발생
path('about/', AboutView)
왜냐하면 Django는 URL에 연결될 때 **함수형 뷰(callable)**를 기대하기 때문입니다.
그래서 클래스형 뷰는 다음처럼 .as_view()를 붙여서 사용합니다:
path('about/', AboutView.as_view())
이것이 바로 클래스를 함수처럼 호출 가능한 형태로 변환하는 입구입니다.
✅ 2. as_view()는 어떤 일을 할까?
as_view()는 Django 내부에서 다음과 같은 일을 합니다:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # 클래스 인스턴스 생성
return self.dispatch(request, *args, **kwargs) # 요청 메서드에 따라 실행
return view
즉, as_view()는 클래스 인스턴스를 만들고, 요청이 들어오면 그 인스턴스의 dispatch() 메서드를 호출해 처리하게 합니다.
✅ 3. dispatch()는 무슨 역할?
dispatch()는 요청의 메서드(GET, POST 등)를 보고, 자동으로 해당 메서드를 실행해주는 중앙 제어 함수입니다.
def dispatch(self, request, *args, **kwargs):
if request.method.lower() == 'get':
return self.get(request, *args, **kwargs)
elif request.method.lower() == 'post':
return self.post(request, *args, **kwargs)
# PUT, DELETE 등도 처리 가능
➡️ 이 구조 덕분에 우리는 CBV에서 get()이나 post()만 정의하면 됩니다.
✅ 4. 전체 요청 흐름 정리
사용자 요청 (GET /about)
↓
URLconf: path('about/', AboutView.as_view())
↓
as_view(): 클래스 인스턴스 생성
↓
dispatch(): request.method 확인 → get() 실행
↓
get(): 템플릿 렌더링 또는 응답 생성
✅ 5. 실제 코드 예시
# views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = 'about.html'
# urls.py
from django.urls import path
from .views import AboutView
urlpatterns = [
path('about/', AboutView.as_view(), name='about')
]
요청이 들어오면:
- AboutView.as_view() 호출
- 인스턴스 생성 → dispatch() 실행
- request.method == 'GET' → get() 실행 → 'about.html' 반환
✅ 6. 한눈에 보는 핵심 요약
메서드 역할
as_view() | 클래스 → 함수형 뷰로 변환 (URL 연결 가능) |
dispatch() | 요청 방식(GET/POST 등)에 따라 메서드 분기 |
get(), post() | 실제 응답을 생성하는 로직 작성 공간 |
🧠 마무리 정리
CBV는 단순히 클래스를 쓰는 것이 아니라,
내부적으로 클래스를 함수처럼 바꾸고, 요청 방식에 따라 메서드를 자동 실행해주는 구조입니다.
이 흐름을 이해하면 CBV가 단순한 문법이 아니라 강력한 구조화 도구라는 걸 체감하게 됩니다!