SteadyDrills

[DJANGO] FBV와 CBV의 차이 본문

웹개발

[DJANGO] FBV와 CBV의 차이

Drills 2024. 11. 20. 23:39

2401120

FBV (Function-Based View)

 

FBV는 뷰를 함수로 정의하여 요청을 처리하는 방식이다. 간단하고 직관적인 방법으로, 소규모 애플리케이션에 적합하다.

 

 

장점

  • 단순성: 간단한 로직을 구현할 때 직관적이며 이해하기 쉽다.
  • 명시성: 요청 처리 과정이 단계별로 명확하다.
  • 빠른 프로토타이핑: 빠르게 뷰를 작성할 수 있어 초기 개발에 유리하다.

 

단점

  • 재사용성 부족: 복잡한 로직이 필요한 경우 코드 중복이 발생할 수 있다.
  • 확장성 제한: 기능이 증가할수록 관리가 어려워질 수 있다.

코드 예시

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer

@api_view(['GET', 'POST'])
def post_list(request):
    if request.method == 'GET':
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

 


CBV (Class-Based View)

 

CBV는 뷰를 클래스로 정의하여 객체 지향적인 방식으로 요청을 처리하는 방식이다. 장고의 강력한 기능을 활용할 수 있다.

 

CBV는 장고의 발전과 함께 등장하여 객체 지향 프로그래밍의 장점을 활용하기 위해 개발되었다. 그렇기 때문에 복잡한 애플리케이션의 필요에 따라 재사용성과 확장성을 제공하기 위한 설계가 되어있다.

 

장점

  • 재사용성: 공통 기능을 부모 클래스에 정의하고 상속받아 사용할 수 있어 코드 재사용이 편리하다.
  • 확장성: 복잡한 애플리케이션에서 기능을 추가하거나 수정하기가 쉽다.
  • 구조적 접근: 뷰 로직을 메서드로 분리하여 가독성과 관리가 편리하다 .

 

단점

  • 복잡성: 초기 설정이 FBV보다 복잡할 수 있으며, 클래스 구조에 익숙하지 않은 개발자에게는 어려울 수 있다.
  • 추상화의 오해: 클래스 기반 접근 방식은 때때로 과도하게 추상화되어 이해하기 어려울 수 있다.

코드 예시

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer

class PostListView(APIView):
    def get(self, request):
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

'웹개발' 카테고리의 다른 글

세션스토어로 사용하는 Redis의 장단점  (0) 2024.12.04
CSRF(Cross-Site Request Forgery) 토큰이란?  (0) 2024.11.22
RESTful 아키텍처  (0) 2024.11.17
SQLite란?  (4) 2024.11.13
Redis란?  (1) 2024.11.08