[Django]FBVs VS CBVs (함수형 뷰 vs 클래스형 뷰)



함수형 Views (FBV)


VS


클래스형 Views (CBV)




1. 시작

Django는 Views.py를 가지고 있습니다. 들어오는 요청 url을 파싱하여 라우팅 처리된 특정 요청을 처리하는 공간이지요. 여기서 Views 를 처리하는 방법은 2가지가 있습니다. 바로 함수 형태로 처리하는 방법과, 클래스로 처리하는 방법입니다. 

Django는 원래 함수형 밖에 없었습니다. 

처음에는 별 문제 없이 사용했다가, 점차 점차 어플리케이션이 커지면서 썼던 코드를 또 쓰고, 또 쓰고, 또 쓰고, 하게 됩니다. 그래서 확장성과 커스터마이징이 힘들어서 클래스형 뷰가 탄생 했습니다.

하지만, 아무리 클래스형 뷰라도 정말 마지막에 뷰를 처리하는 건 함수 입니다.




2. 함수형 뷰

함수를 사용하는 뷰는 너무나 심플하고 가속성이 좋습니다. 

아래 처럼 심플하게 사용할 수 있습니다.

# urls.py
urlpatterns = [
path('', views.index, name='index'),
]
# views.py
def index(request):
if request.method == 'POST':
# POST 요청일경우
else:
# POST 요청이 아닐 경우




3. 클래스형 뷰

우선 아래의 예시를 보겠습니다.

#urls.py
urlpatterns = [
path('', IndexView.as_view()),
]
#views.py
from django.views.generic import View


class IndexView(View):
model = 사용할 모델이 있다면

def get(self, request):
# Get 리퀘스트 일경우
def post(self, request):
# POST 리퀘스트 일경우


별반 차이가 없어보입니다. Generic Class-Based View를 사용 하기 전까지는요..

우리는 웹어플리케이션을 만드는데 필요한 기능이 사실 몇개 없습니다. 몇 개내로 압축이 되죠. 

  • 새로운 객체를 만들거나
  • 폼 데이터를 다루거나
  • 리스트를 만들거나
  • 페이지네이션을 하고
  • 아카이브 뷰(일정 조건의 문서 집합)

등 사실 몇개 안됩니다.

위를 보면 IndexView는 View를 django.views.Generic 에서 상속 받아 왔습니다. 이미 빌드인 되어 있는 기능으로 훌륭하고 빠르게 개발해 낼 수 있습니다. 아래는 Generic View 종류 입니다. 많이 있습니다 한번 둘러 보셔요.

Django 공식문서
https://docs.djangoproject.com/en/3.0/ref/class-based-views/




4. Generic View 다 알아야 하나요?

아니요. 쓸 것만 알면 됩니다. 다 쓸일도 잘 없고, 실제로 다 쓰는것에 대한 갑론을박이 있습니다. 쓰는게 좋다. 아니다. 등


제가 얼마전에 사람인에 들어갈일이 있어서 봤는데 Django 개발자를 뽑는데 Two Scoops of Django 책을 읽으신 분들만 지원하라는 공고를 보았습니다. 재미 있는 책이긴 한데 읽은 분들만 지원하게 하는건 좀...;; 아무튼 좋은 책입니다. 반드시 읽어보세요. 도움이 되긴 할 거에요. 그리고 각 챕터, 챕터가 다 독립적이니까 정독은 안해도 됩니다. 한글판이 있긴 한데 한번 보셔요. 알라딘

그 책에 있는 내용입니다(발췌)

  • "모든 Generic View를 사용하라는 집단" - 다 사용해! 생산성이 좋아질 거야!
  • "아냐 View만 사용해도 충분히 다 할 수 있다" - View만 사용해. 그래도 충분해.
  • "이왕이면 사용 하지마" - 이왕이면 클래스형 뷰 자체를 쓰지마. 재사용을 해야 하는 곳에만 제한적으로 사용해.   



아.. 그래도 CBV가 최신 기술이니까 더 좋지 않을까?

장고 공식문서에 이런말이 있습니다.

The Newer is often better, not always.

새로운 것이 항상 더 좋진 않다. 뭐 영어 문구가 정확히 일치하는지는 모르겠지만, 그리고 정확히 이야기 하면 장고 문서에서 봤는지 파이썬 문서에서 봤는지 기억이 안나지만...(지금 생각해보니 파이썬 3.5가 3.6보다 빨리서 거기서 본 것 같기도 하고..) 저런 말이 있습니다. 새로운 기술이 항상 좋은 건 아닙니다.



장점단점
CBV
  • 확장에 용의(재사용)
  • 다중 상속 Mixin등 사용 가능
  • HTTP Method가 클래스 안에서 나누어 처리
  • 강력한 Generic Class View 가 있음
  • 읽기 어려움(코드 흐름이 암시적)
  • 상속되고 믹스되면서 코드 이해를 위해 찾아다녀야함
  • 데코레이터 사용시 별로도 import 하거나 Method 생성
FBV
  • 편하게 구현가능
  • 매우 읽기 쉬움
  • 데코레이터 사용이 명료함
  • 확장 / 재사용이 힘듬





5. 결론

여기에서, 옳고 그름은 없습니다. 그때 그때 상황에 맞추어 하면 됩니다. 아직도 FBV로만 구현된 서비스나 웹사이트들 자아아아알 돌아들 가고 있습니다. CBV가 할수 있는 일을 FBV가 못하는 경우는 없습니다. 

아래 상황은 코딩을 잘하는게 아니에요. 착각입니다.

  • "오.. CBV로 하니까 다른사람들이 내 코딩을 잘 이해못함.. 난 역시 잘함"
  • "오.. FBV로 하니까 서로서로 명료하게 이해되고 좋네.. 코드 재사용은 힘들어서 노가다를 하지만, 가독성이 좋으니까.. 난 역시 잘함!"


전 대체로 섞어쓰자는 주의긴 한데, 맞고 틀린 문제라기 보다 습관에 문제에 가까운 것 같습니다. 섞어 쓰자는 주의라도 섞어지지가 않아요 잘..;;


  • [[a.original_name]] ([[a.file_size | fileSizer]])
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'Django' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]