기술블로그-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가 단순한 문법이 아니라 강력한 구조화 도구라는 걸 체감하게 됩니다!