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

2021. 5. 3. 20:52·SW개발/Django

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

'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
'SW개발/Django' 카테고리의 다른 글
  • [Django]추천하는 모듈 import 순서
  • [Django]DRF SerializerMethodField() 란?
  • [Django]Django ORM, 실수하기 쉬운 Queryset의 특징
  • [Django]예제를 통해 알아보는 Django ORM이 호출하는 SQL의 구조 (feat. select_related, prefetch_related)
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • SW개발 (303)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (1)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배달
    트리 #AVL #알고리즘 #자료구조
    g
    음식
    오픈소스
    컨트리뷰터
    배공파용
    배달비 공유
    플레이스토어
    Contributor
    어플리케이션
    django
    라이프 스타일
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[Django]FBV vs CBV (함수형 뷰 vs 클래스형 뷰)
상단으로

티스토리툴바