SW개발/Django

[Django]FBV vs CBV (함수형 뷰 vs 클래스형 뷰)

Django는 MTV(Model - Template - View)패턴을 기반으로 하는 프레임 워크이다.

여기에서 V에 해당하는 view를 작성하는 방법에는 두 가지가 존재한다.

  1. 함수형 뷰 (Function based view)
  2. 클래스형 뷰 (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