시작
django에서 urls.py에 들어갈 함수나 클래스 등은 views.py에서 정의한다. views.py를 만들때 FBV와 CBV 두가지 선택지가 존재한다.
FBV
FBV(Function based view)는 말 그대로 함수에 기반을 둔 방법이다. 함수를 직접 만들어 원하는 기능을 직접 구현할 수 있으며 심플하고 가속성이 좋다.
단점은 확장, 재사용이 어렵다. 또한 조건문으로 HTTP 메소드를 구분해야하는 단점이 있다.
urls.py
urlpatterns=[
path('', views.index, name='index'),
]
views.py
def index(request):
if request.method == 'POST':
return HttpResponse("Post method")
else:
return HttpResponse("Get method")
CBV
CBV(Class basded view)는 장고가 제공하는 클래스를 활용해 구현하는 방법이다. 장고는 웹 개발 시 반복적으로 많이 구현하는 것들을 클래스로 미리 구현해서 사용자에게 제공한다.
장점으로는 확장, 재사용이 용이하며, 다중상속이 가능하고, HTTP 메소드가 클래스 안에서 나누어 처리가 가능하다.
단점으로는 코드 흐름이 암시적이어서 읽기 어려우며, 상속되고 믹스되면서 코드 이해를 위해 찾아다녀야 한다.
urls.py
urlpatterns = [
path('', views.IndexView.as_view()),
]
views.py
from django.views.generic import View
class IndexView(View):
model =
def get(self, request):
def post(self, request):
CBV 가이드라인
- 뷰는 간단 명료해야 한다.
- 뷰 코드의 양은 적으면 적을수록 좋다.
- 뷰 안에서 같은 코드를 반복적으로 사용하지 않는다.
- 뷰는 프레젠테이션 로직에서 관리, 비즈니스 로직은 모델에서 처리한다.
- 403, 404, 500 에러 헨들링에는 FBV를 사용한다.
- 믹스인은 간단명료해야 한다.
제너릭 뷰와 상속
제너릭 뷰의 4가지 분류
- 기반뷰(Base View): 뷰 클래스를 생성, 다른 제너릭 뷰의 부모 클래스가 되는 기본 제너릭 뷰
- 제너릭 보기 뷰(Generic Display View): 객체의 목록 또는 하나의 객체 상세 정보를 보여주는 뷰
- 제너릭 수정 뷰(Generic Edit View): 폼을 통해 객체를 생성, 수정, 삭제 기능을 제공하는 뷰
- 제너릭 날짜 뷰(Generic Date View): 날짜 기반 객체 연/월/일 페이지로 구분해 보여주는 뷰
주요 제너릭 뷰 목록
기반 뷰(Base View)
- View: 최상위 부모 제너릭 뷰 클래스
- TemplateView: 주어진 템플릿으로 렌더링
- RedirectView: 주어진 URL로 리다이렉트
제너릭 보기 뷰(Generic Display View)
- DetailView: 조건에 맞는 하나의 객체 출력
- ListView: 조건에 맞는 객체 목록 출력
제너릭 수정 뷰(Generic Edit View)
- FormView: 폼이 주어지면 해당 폼을 출력
- CreateView: 객체를 생성하는 폼 출력
- UpdateView: 기존 객체를 수정하는 폼을 출력
- DeleteView: 기존 객체를 삭제하는 폼을 출력
제너릭 날짜 뷰(Generic Date View)
- YearArchiveView: 주어진 연도에 해당하는 객체 출력
- MonthArchiveView: 주어진 월에 해당하는 객체 출력
- DayArchiveView: 주어진 날짜에 해당하는 객체 출력
- TodayArchiveView: 오늘 날짜에 해당하는 객체 출력
- DateDetailView: 주어진 연, 월, 일 PK(또는 슬러그)에 해당하는 객체 출력
결론
FBV와 CBV중 어느것이 낫다고 단정지을 필요는 없다. 필요에 따라 선택하면 된다. FBV만으로도 구현된 웹 사이트나 서비스도 존재하며 CBV가 하는일을 FBV가 못하는 경우는 없으니 필요에 따라 사용하는 것이 중요하다.
Reference
https://dingrr.com/blog/post/djangofbvs-vs-cbvs-%ED%95%A8%EC%88%98%ED%98%95-%EB%B7%B0-vs-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%98%95-%EB%B7%B0
https://wikidocs.net/9623