기술블로그-Django편

📘 Django에서 as_view()가 필요한 이유 - FBV vs CBV 완전 정리

Chansman 2025. 5. 19. 11:35

📘 Django에서 as_view()가 필요한 이유 - FBV vs CBV 완전 정리

✨ 1. 질문 요약

❓ FBV(Function-Based View)는 path()에 그냥 함수 이름을 넣는데,
CBV(Class-Based View)는 왜 꼭 .as_view()를 붙여야 하나요?


🧠 2. 핵심 비교 요약

항목 FBV (함수 기반 뷰) CBV (클래스 기반 뷰)

뷰 타입 함수 (def) 클래스 (class)
URL에 연결 방식 my_view MyView.as_view()
호출 시 동작 직접 호출 내부 메서드 (get, post)에 매핑됨
.as_view() 필요 여부 ❌ 필요 없음 ✅ 필수

🔍 3. FBV: 함수 기반 뷰 예시

def hello_view(request):
    return HttpResponse("Hello World")

urlpatterns = [
    path('', hello_view),  # ✅ 함수 그대로 사용 가능
]
  • hello_view는 그냥 Python 함수이기 때문에 Django가 직접 실행할 수 있습니다.

🧱 4. CBV: 클래스 기반 뷰 예시

from django.views import View

class HelloView(View):
    def get(self, request):
        return HttpResponse("Hello Class")

urlpatterns = [
    path('', HelloView.as_view()),  # ✅ 반드시 as_view() 사용
]
  • HelloView는 클래스이기 때문에, Django는 그 자체로 호출할 수 없습니다.
  • .as_view()를 사용하면 → 내부적으로 클래스를 인스턴스화하고,
    get()이나 post() 같은 메서드를 자동으로 연결해주는 뷰 함수로 변환됩니다.

🔧 5. as_view()는 어떤 일을 할까?

def as_view():
    def view(request):
        self = MyView()               # 클래스 인스턴스 생성
        if request.method == 'GET':
            return self.get(request) # 메서드 매핑
        elif request.method == 'POST':
            return self.post(request)
    return view
  • 실제 코드는 더 복잡하지만 기본 원리는 위와 같습니다.
  • 요청 메서드(GET, POST 등) 에 따라 알맞은 메서드를 실행하는 구조입니다.

⚠️ 6. .as_view()를 안 쓰면?

urlpatterns = [
    path('', HelloView),  # ❌ TypeError 발생
]
  • 클래스는 함수처럼 호출할 수 없기 때문에 Django가 에러를 발생시킵니다:
  • TypeError: 'HelloView' object is not callable

🧠 7. 마무리 요약

항목 정리

FBV는 왜 as_view 필요 없음? 함수니까 Django가 직접 호출 가능
CBV는 왜 as_view 필요? 클래스이므로 요청 처리용 함수로 변환 필요
as_view 역할 클래스 → 요청 가능한 함수로 변환 (메서드 분기 자동처리)

💡 실전 팁

  • CBV를 쓸 땐 항상 as_view()를 붙여야 한다는 걸 습관화하세요.
  • dispatch(), get(), post()를 커스터마이징하면 보다 세밀한 컨트롤도 가능해요.

필요하시면 CBV 내부 구조, dispatch 흐름, DRF에서의 CBV 적용 예시도 함께 정리해드릴게요! 💪