Django는 MTV(Model - Template - View)패턴을 기반으로 하는 프레임 워크이다.
여기에서 V에 해당하는 view를 작성하는 방법에는 두 가지가 존재한다.
- 함수형 뷰 (Function based view)
- 클래스형 뷰 (Class based view)
FBV 란?
뷰를 작성할 때 함수 형식으로 작성하는 방식이다. 아래와 같이 간단하게 뷰 로직을 작성할 수 있다.
# urls.py
urlpatterns= [
path('', views.index, name='index'),
]
# views.py
@api_view(['GET', 'POST'])
def index(request):
if request.method == 'POST':
return HttpResponse("Post method")
else:
return HttpResponse("Get method")
CBV 란?
뷰를 작성할 때 클래스 형식으로 작성하는 방식이다.
# urls.py
urlpatterns= [
path('', views.IndexView.as_view(), name='index'),
]
# views.py
from django.views import View
class ContactView(View):
def post(self, request):
return HttpResponse("Post method")
def get(self, request):
return HttpResponse("Get method")
두 방법 모두 같은 기능을 하는 View 이다. 단지 차이점은 로직을 클래스로 구현할 것인지, 함수로 구현할 것인지에 대한 차이이다.
그렇다면, 어느 상황에서 무엇을 쓰는 것이 좋다고 할 수 있을까 ? 정답은, 어느것을 사용해도 무방하다.
FBV로 구현한 로직은 CBV로 구현할 수 있고, CBV로 구현한 로직 역시 FBV로 구현할 수 있다.
한가지 질문이 더 생길 수 있다. 그러면 사용하기 편한 FBV만 쓰면 되지 않나요? 그렇지 않다, 상황에 따라 다르다.
장단점을 비교해보면서 어느 상황에 무엇이 필요한 지를 알아보겠다.
FBV와 CBV의 장단점
장점 | 단점 | |
FBV | 편하게 구현 가능 읽기 편한 로직 데코레이터 사용이 명료함 |
확장 / 재사용이 어려움 |
CBV | 확장 / 재사용 용이 다중 상속, Mixin 가능 HTTP Method가 클래스 안에서 나누어 처리 강력한 Generic Class View |
읽기 어려움 상속, Mixin으로 인해 코드 이해를 위해 여러 곳을 찾아봐야 함 |
즉, 상속/재사용이 많이 필요한 프로젝트의 경우에는 CBV, 그렇지 않은 경우에는 FBV를 사용하면 된다.
물론 하나의 프로젝트에서 한 가지의 기법만 사용해야만 되는 것은 아니기에 CBV/FBV 를 적절히 섞어서 사용하는 방법 또한 좋을 것이다.
각 방법들에 대해 장단점을 정확히 인지하고 적절히 사용한다면 그것이 바로 정답이 될 것이다.
728x90
'SW개발 > Django' 카테고리의 다른 글
[Django]추천하는 모듈 import 순서 (0) | 2021.05.07 |
---|---|
[Django]DRF SerializerMethodField() 란? (0) | 2021.05.06 |
[Django]Django ORM, 실수하기 쉬운 Queryset의 특징 (4) | 2021.04.26 |
[Django]예제를 통해 알아보는 Django ORM이 호출하는 SQL의 구조 (feat. select_related, prefetch_related) (10) | 2021.04.21 |
[Django]Django select_related() 와 prefetch_related() (2) | 2021.04.15 |