본문 바로가기
Programming/Django

DRF(Django REST Framework) 개발자를 위한 비교: APIView vs. Viewsets 🧐

by Mandy's 2025. 8. 7.

DRF로 API를 개발하다 보면, 뷰(View)를 만들 때 APIView와 Viewsets 중에서 어떤 것을 사용해야 할지 고민하게 됩니다.

두 가지 모두 훌륭한 도구지만, 각각의 특징과 장단점을 이해하면 상황에 맞는 더 효율적인 코드를 작성할 수 있어요. 


1. APIView: 섬세한 제어가 가능한 장인 정신 🎨

APIView는 DRF의 기본 뷰 클래스로, HTTP 메서드(GET, POST, PUT, DELETE)에 따라 함수를 직접 정의하는 방식입니다.

마치 수공예 장인이 작품을 만들 듯, API 엔드포인트의 동작을 하나하나 섬세하게 제어할 수 있어요.

장점:

  • 명확한 제어: 각 HTTP 메서드에 대한 로직을 get(), post()와 같이 별도의 함수로 작성하므로 코드가 직관적이고 명확합니다.
  • 유연성: 특정 HTTP 메서드에만 다른 인증이나 권한 설정을 적용하는 등, 매우 유연하게 로직을 구성할 수 있습니다.
  • 간단한 엔드포인트에 적합: 하나의 엔드포인트가 특정 기능(예: 파일 업로드, 커스텀 액션)만 수행할 때 사용하기 좋습니다.

단점:

  • 반복되는 코드: 여러 엔드포인트(예: 목록 조회, 상세 조회, 생성, 수정, 삭제)를 만들려면, 각 엔드포인트마다 뷰 클래스와 URL을 따로 정의해야 해서 코드가 길어질 수 있습니다.

예시 코드:

# APIView를 사용한 유저 목록 조회/생성
from rest_framework.views import APIView
from rest_framework.response import Response

class UserList(APIView):
    def get(self, request):
        # 사용자 목록을 조회하는 로직
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request):
        # 새로운 사용자를 생성하는 로직
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

위 코드처럼 GET과 POST를 UserList 클래스에서 각각 처리합니다.


2. Viewsets: 효율적인 생산성을 추구하는 공장 🏭

Viewsets는 여러 CRUD(Create, Retrieve, Update, Delete) 작업을 하나의 클래스에 묶어서 처리하는 방식입니다. APIView의 반복적인 코드를 줄여주며, 특히 routers와 함께 사용하면 URL 설정까지 자동으로 처리해줘 생산성이 비약적으로 향상됩니다. 마치 공장에서 표준화된 제품을 효율적으로 생산하는 것과 비슷해요.

장점:

  • 코드의 간결함: list(), retrieve(), create(), update(), destroy()와 같은 메서드만 정의하면 여러 엔드포인트를 한 번에 처리할 수 있습니다.
  • 높은 생산성: routers를 사용하면 URL 패턴을 자동으로 생성해주기 때문에, URLConf 파일이 훨씬 깔끔해지고 개발 속도가 빨라집니다.
  • 통일된 로직: CRUD 작업에 대한 로직이 한 클래스에 모여 있어 유지보수가 용이합니다.

단점:

  • 상대적으로 낮은 유연성: 커스텀 로직이 많거나, RESTful하지 않은 복잡한 API를 만들 때는 APIView보다 다소 불편할 수 있습니다.
  • 새로운 개념 학습: routers와 같은 추가적인 개념을 이해해야 합니다.

예시 코드:

 
# Viewsets를 사용한 유저 관리
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    # 유저 목록, 상세, 생성, 수정, 삭제를 모두 처리
    queryset = User.objects.all()
    serializer_class = UserSerializer

한눈에 보는 비교 표 📊

특징 APIView Viewsets
목적 HTTP 메서드 기반의 API 뷰 CRUD 작업 기반의 API 뷰
코드 스타일 각 HTTP 메서드에 대한 함수 작성 CRUD 메서드를 포함한 클래스 작성
URL 설정 수동으로 urls.py에 직접 등록 routers를 통해 자동 생성 가능
코드의 길이 엔드포인트마다 길어질 수 있음 간결하고 짧음
유연성 매우 높음 (커스텀 로직에 강점) 상대적으로 낮음
개발 생산성 낮음 매우 높음 (특히 routers 사용 시)
추천 상황 복잡하고 커스텀 로직이 많은 엔드포인트, 단일 기능 엔드포인트 CRUD 기반의 표준 RESTful API
 

결론: 어떤 것을 선택해야 할까요? 🤔

  • APIView하나의 엔드포인트에 복잡하고 특별한 로직을 구현해야 할 때 선택하세요. 예를 들어, 회원가입 시 인증 코드를 보내는 기능처럼 RESTful 하지 않은 커스텀 액션에 적합합니다.
  • Viewsets모델 기반의 일반적인 CRUD API를 만들 때 선택하세요. 특히 routers와 함께 사용하면 빠르고 효율적으로 코드를 작성할 수 있어, 대부분의 경우에 Viewsets를 사용하는 것이 좋습니다.

결국 두 도구는 상호 보완적인 관계에 있습니다. 프로젝트의 규모와 API의 복잡성을 고려하여 가장 효율적인 방법을 선택하는 것이 중요합니다. 행복한 코딩하세요! 🚀