[Django] 클레스 기반 뷰(CBV) 와 함수 기반 뷰(FBV) 의 차이점은 무엇이고, 언제 사용하는게 좋을까?

msung99·2023년 10월 6일
0
post-thumbnail

학습배경

항상 장고를 학습할 때 마다 뷰(View) 코드를 개선해야할 수 밖에 없고, 이때 자주 등장하는 키워드가 바로 클래스 기반 뷰함수 기반 뷰 였습니다. 이번 기회에 이 둘의 개념에 대해 확실히 다지고, 차이점을 분석하고, 각각 언제 활용하는게 좋을지에 대해 생각해보고자 합니다.


함수 기반 뷰(Function-Based Views)

간단히 말해, 뷰를 작성할 때 클래스를 기반으로 작성하는 것이 클래스 뷰이며, 반면 함수를 기반으로 작성하는 것이 함수형 뷰 입니다. 두 방법 모두 대부분의 CRUD 구현 상에선 같은 기능을 하는 View 입니다.

함수 기반 뷰는 django.views.View 를 상속받는 대신에, 직접 함수를 작성하여 요청을 처리합니다. 보통의 경우 @api_view() 로 메소드가 무엇인지 명시후에 여러 request 메소드를 사용할 경우 if 조건문으로 요청을 분기처리 해줍니다.

@api_view(['GET', 'POST'])
def index(request):
  if request.method == 'POST':
    return HttpResponse("Post Method")
  else:
    return HttpResponse("Get Method")

클래스 기반 뷰이든, 함수 기반 뷰이든 실행하는 것은 함수입니다. 저희가 View.as_view() 클래스 메소드를 사용하여 URL 정의에 뷰를 추가하면 이는 view 라는 함수를 반환합니다.

  • 장점 : 구현이 간단하며, 읽기 편합니다. 무엇보다 데코레이터 사용이 편합니다.
  • 단점 : 코드를 확장하거나 재사용하기 어렵습니다. 조건문으로 HTTP 메소드를 구분해야하므로, 확장성이 어려워집니다.

클래스 기반 뷰(Class-Based Views)

앞서 설명했듯이, 클래스 기반 뷰란 뷰를 작성시 클래스 형식으로 작성하는 방식입니다.

class myView(View):
  def post(self, request):
    return HttpResponse("POST!");
  def get(self, request):
    return HttpResponse("Get!");
  • 장점 : 확장성, 재사용성에 있어서 용이합니다. 또한 다중 상속과 Mixin 사용이 가능합니다. 무엇보다 제네릭 뷰 를 활용할 수 있게됩니다.

  • 단점 : 자칫 잘못 사용하면 가독성이 저하될 수도 있습니다.


어떤 상황에서 어떤것을 사용해야할까?

두 방법 모두 같은 기능을 하는 View 이고, 단지 차이점은 로직을 클래스로 구현할 것인지, 함수로 구현할 것인지의 차이가 전부입니다. 그렇다면 어떤 상황에서 무엇을 활용하는 것이 좋은 선택지가 될까요?

제가 내린 결론은상속재사용 이 많이 요구되는 상황에선 CBV 를 활용하고, 그 반대의 경우라면 FBV 를 사용하는게 좋을 것 같습니다. 몰론 하나의 프로젝트에서 하나만 적용하는것은 사실상 힘들기 때문에, 이 둘을 적절히 세부 상황에따라 섞여서 활용하는 것이 최고의 방안이라는 생각이 드네요!


참고

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글