항상 장고를 학습할 때 마다 뷰(View) 코드를 개선해야할 수 밖에 없고, 이때 자주 등장하는 키워드가 바로 클래스 기반 뷰
와 함수 기반 뷰
였습니다. 이번 기회에 이 둘의 개념에 대해 확실히 다지고, 차이점을 분석하고, 각각 언제 활용하는게 좋을지에 대해 생각해보고자 합니다.
간단히 말해, 뷰를 작성할 때 클래스를 기반으로 작성하는 것이 클래스 뷰이며, 반면 함수를 기반으로 작성하는 것이 함수형 뷰 입니다. 두 방법 모두 대부분의 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 myView(View):
def post(self, request):
return HttpResponse("POST!");
def get(self, request):
return HttpResponse("Get!");
장점 : 확장성, 재사용성에 있어서 용이합니다. 또한 다중 상속과 Mixin 사용이 가능합니다. 무엇보다 제네릭 뷰
를 활용할 수 있게됩니다.
단점 : 자칫 잘못 사용하면 가독성이 저하될 수도 있습니다.
두 방법 모두 같은 기능을 하는 View
이고, 단지 차이점은 로직을 클래스로 구현할 것인지, 함수로 구현할 것인지의 차이가 전부입니다. 그렇다면 어떤 상황에서 무엇을 활용하는 것이 좋은 선택지가 될까요?
제가 내린 결론은상속
과 재사용
이 많이 요구되는 상황에선 CBV
를 활용하고, 그 반대의 경우라면 FBV
를 사용하는게 좋을 것 같습니다. 몰론 하나의 프로젝트에서 하나만 적용하는것은 사실상 힘들기 때문에, 이 둘을 적절히 세부 상황에따라 섞여서 활용하는 것이 최고의 방안이라는 생각이 드네요!