🔍 Django REST Framework - GenericAPIView란?
Django REST Framework(DRF)에서는 API를 만들 때 APIView보다 더 강력하고 편리한 기능을 제공하는 것이 바로 **GenericAPIView**입니다.
이 글에서는 GenericAPIView가 무엇인지, 왜 필요한지, 어떻게 사용하는지 예제와 함께 자세히 정리해드립니다.
✅ GenericAPIView란?
GenericAPIView는 DRF에서 공통 기능(쿼리셋 조회, 시리얼라이저 연결 등)을 미리 구현해 둔 뷰 클래스입니다.
- APIView에서 반복적으로 작성하던 작업들을 간단하게 처리할 수 있게 도와줍니다.
- 이후에 나오는 ListAPIView, CreateAPIView 등 다양한 제네릭 뷰들의 기반 클래스입니다.
🧠 왜 GenericAPIView를 쓸까?
문제 해결책
APIView는 모든 걸 직접 구현해야 해서 코드가 길어짐 | GenericAPIView는 자주 쓰는 로직을 기본 제공함 |
시리얼라이저, 쿼리셋 처리를 매번 써야 함 | get_queryset(), get_serializer() 자동 처리 |
⚙️ 주요 기능 정리
기능 설명
queryset | 자동으로 데이터를 가져올 대상 설정 |
serializer_class | 사용할 시리얼라이저 클래스 지정 |
get_queryset() | 쿼리셋 커스터마이징 가능 |
get_serializer() | 시리얼라이저 인스턴스 자동 생성 |
lookup_field | 기본 pk 외의 필드로 조회 가능 (예: slug) |
🏗️ 상속 구조 (중요!)
APIView
└── GenericAPIView
├── ListAPIView
├── CreateAPIView
├── RetrieveAPIView
├── UpdateAPIView
├── DestroyAPIView
└── 조합형 (ListCreateAPIView 등)
✔️ GenericAPIView는 DRF 제네릭 뷰의 핵심 뼈대입니다.
📦 사용 예시
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
class UserListAPIView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request):
users = self.get_queryset()
serializer = self.get_serializer(users, many=True)
return Response(serializer.data)
✔️ 작동 방식
- get_queryset() → 자동으로 queryset 속성 가져옴
- get_serializer() → 자동으로 serializer_class 인스턴스 생성
- Response(serializer.data) → JSON 응답 반환
🆚 APIView vs GenericAPIView
항목 APIView GenericAPIView
유연성 | 높지만 불편함 | 높고 편리함 ✅ |
코드 길이 | 직접 구현 많음 | 기본기능 내장됨으로 짧음 ✅ |
자동화 | 없음 | 있음 ✅ |
📌 결론 정리
항목 내용
정의 | 공통 기능이 구현된 DRF 기본 API 클래스 |
주 용도 | ListAPIView, CreateAPIView 등의 기반 클래스 |
장점 | queryset, serializer_class만 적으면 나머지는 자동 처리 |
추천 상황 | 중복되는 API 로직을 줄이고 싶을 때 👍 |
다음 단계로는 ListAPIView, CreateAPIView, RetrieveAPIView 등을 학습해보세요!
GenericAPIView의 진짜 파워는 거기서 시작됩니다 💪
'기술블로그-Django편' 카테고리의 다른 글
🧠 Django에서 name=name 의미 완전 정리하기 (0) | 2025.05.15 |
---|---|
🔍 Django의 object vs objects 완전 정리! (0) | 2025.05.15 |
🤖 Pseudo Code란? (가짜 코드) (0) | 2025.05.15 |
🔄 클래스/함수 이름 변경 시 꼭 써야 할 리팩토링 기능 (Refactor → Rename) (0) | 2025.05.15 |
✅ Django DRF에서 Serializer 유효성 검사, 내부 구조까지 완전 정복! (0) | 2025.05.15 |