기술블로그-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 적용 예시도 함께 정리해드릴게요! 💪