[Django] View, FBV, CBV

코멘토 부트캠프의 Django 개발 실무과정을 듣고 배웠던 내용을 주차별로 나누어 정리해보려합니다.

코멘토 직무 부트캠프 바로가기


하나의 글에 배웠던 모든 내용과 코드를 작성할 경우 글이 너무 길어지기 때문에 핵심적인 내용만 요약해서 정리할 예정입니다. 과정을 마무리하는 단계에서 지금(현재 6주차)까지 배웠던 내용을 주제별로 나눈다면 다음과 같습니다.

week1: Django가 무엇인지, 가상환경, 프로젝트 세팅에 관하여
week2: Model, View, Template, 템플릿 상속
week3: ORM,
week4: FBV, CBV
week5: Authentication
week6: AWS 배포


Class Based Views vs Function Based Views

  • Django에는 Function Based Views(FBV)와 Class Based Views(CBV)의 두 가지 뷰 유형이 있습니다. Django는 처음에는 FBV로만 시작했지만, 그 후 기능을 템플릿화하는 방법으로 CBV를 추가함으로써 기본적인 코드(즉, 보일러 플레이트코드)를 반복해서 작성할 필요가 없어졌습니다.

  • CBV의 핵심은 Python 클래스입니다. Django에는 다양한 "템플릿" CBV가 포함되어 있으며, 이 CBV에는 재사용할 수 있는 기능이 미리 구성되어 있으며, 종종 확장도 가능합니다. 그런 다음 이러한 클래스에 제공되는 기능의 종류를 설명하는 유용한 이름이 지정됩니다. 일반적인 요구 사항에 대한 솔루션을 제공하기 때문에 "generic views"라고 불리는 경우가 많습니다. 클래스에는 Django의 프로젝트 사이트에 제공되는 기능, 필요한 설정 또는 가능한 설정, 확장 방법이 기재되어 있습니다.


Django의 View는 다음의 3가지 요구조건이 있습니다.

View는 호출가능한(callable) 객체

  • View는 함수 또는 클래스 기반 View일 수 있습니다.
  • CBV는 dispatch() 메서드를 사용하여 HTTP 동사(get, post 등)에 따라 적절한 메서드를 호출하는 as_view() 메서드를 상속합니다.
  • HttpRequest 개체를 첫 번째 위치 인수로 받아들여야 합니다.
  • HttpResponse 개체를 반환하거나 예외를 발생시켜야 합니다.

Functional Based View

  • 공통 기능들은 Decorator 문법을 사용
@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def my_view(request):
	return Response({"msg": "hello world"})

장점

  • 구현의 단순함
  • 쉬운 가독성
  • 명시적인 코드의 흐름
  • 데코레이터 사용
  • 일회성, 특수 기능에 적합한 구현

단점

  • 확장 및 재활용이 어렵다.
  • 조건부 분기를 통한 HTTP 메서드 처리

Functional Based View는 특수한 기능을 위해 구현하는 경우 사용할 수 있습니다. 일반적으로 큰 프로젝트에 CRUD 기능이 반복적으로 나타나기 때문에 불필요한 코드가 많이 생깁니다.

이러한 단점을 극복하기 위해 등장한 것이 Class Based View이고 generic view가 사용됩니다.


Class Based View

클래스 기반 뷰를 사용하면 View가 함수가 아닌 Python class로 구현될 수 있습니다. Functional Based view를 대체하는 것은 아니지만 Functional Based view와 비교했을 때 특정 차이점과 장점이 있습니다.

장점

  • 코드 재사용성
    CBV에서는 view 클래스를 다른 view 클래스로 상속하여 사례에 맞게 변경할 수 있습니다.

  • DRY
    CBV를 사용하면 코드 중복을 줄일 수 있습니다.

  • 코드 확장성
    CBV를 확장하여 Mixin을 사용하여 더 많은 기능을 포함할 수 있습니다.

  • 코드 구조화
    CBV에서는 클래스 기반 뷰는 단일 함수 기반 뷰 내에서 조건부 분기문이 아닌 다른 클래스 인스턴스 메서드를 사용하여 다양한 http 요구에 응답할 수 있습니다.

  • Built-in generic class-based views를 사용할 수 있습니다.

단점

  • 읽기가 어렵습니다.
  • 코드 흐름이 직관적이지 않습니다.
  • 공통 기능은 상속으로 처리하며 이를 위해 여러개의 모듈을 임포트하고 오버라이딩 해야합니다.
class MyView(APIView):
      throttle_classes = [OncePerDayUserThrottle]
      
      def get(self, request):
      		return Response({"msg": "hello world"})

Generic views

Django Generic Class-Based Views

Generic Class-Based Views는 새로운 오브젝트 작성, 폼 처리, 리스트 뷰, 페이지 설정등 웹 어플리케이션에서 자주 사용되는 기능을 제공하기 위해 도입되었습니다. 이는 Django 코어로 제공되며 이를 활용해 개발 과정을 가속화할 수 있습니다.

Django는 웹 개발에서 일반적인 작업 중 화면의 리스트를 표시하는 ListView 등의 다양한 View 기능과 Mixins, Generic Class-Based Views를 제공합니다.

이는 일반적으로 자주 사용되는 기능들을 번거롭게 구현할 필요없이 제공하는 기능들을 로직에 맞게 사용하면 됩니다. 바퀴를 반복해서 재창조할 필요가 없도록 하는 것입니다.

from django.views.generic import CreateView 
class MyCreateView(CreateView):
    model = MyModel  
    form_class = MyForm

이렇게 간단하게 작성해도 코드가 동작합니다. 그 이유는 상속한 CreateView에 필요한 기능이 모두 구현되어있기 때문입니다. CreateView가 제공하는 모든 기능을 필요에 맞게 커스텀해서 사용할 수 있습니다.

이 외에도 http://ccbv.co.uk/ 에 들어가보면 Django Generic Based View에서 원하는 기능에 맞게 다양한 옵션을 선택할 수 있습니다.


수업화면

좋은 웹페이지 즐겨찾기