728x90
반응형
**Django Rest Framework (DRF)**에서 viewsets는 여러 개의 HTTP 요청 메서드에 대한 동작을 한 클래스에 모아 효율적으로 관리할 수 있게 해주는 도구다. ViewSets는 기존의 APIView 나 GenericAPIView 를 상속받아 기능을 확장한 형태로, RESTful API 개발을 더욱 간결하게 만들어준다.
ViewSet 이란?
ViewSet은 **"한 리소스에 대한 CRUD 작업을 단일 클래스에서 처리할 수 있도록 제공되는 기능"**이다. 즉, HTTP 메서드(GET, POST, PUT, DELETE 등)를 처리하는 메서드를 미리 제공하며, URL 라우팅과 연결해 편리하게 사용할 수 있다.
ViewSet 의 종류
- ViewSet
- rest_framework.viewsets.ViewSet을 기본으로 한 가장 일반적인 클래스이다.
- HTTP 메서드에 따라 원하는 기능을 직접 정의해야 한다.
- ModelViewSet
- rest_framework.viewsets.ModelViewSet을 상속받아 CRUD 작업을 자동으로 제공한다.
- queryset과 serializer_class만 설정하면 된다.
- ReadOnlyModelViewSet
- 읽기 전용 뷰셋으로 GET 메서드만 지원한다.
- 데이터를 조회하거나 목록을 반환하는 기능만 필요할 때 사용한다.
ViewSet의 주요 특징
- 단순화된 코드
- 하나의 클래스에서 CRUD 로직을 모두 처리할 수 있어 코드가 간결해진다.
- Router와의 연동
- DefaultRouter나 SimpleRouter를 사용해 URL 라우팅이 자동으로 설정된다.
- 개발자가 URL을 직접 설정할 필요가 없다.
- 유연한 확장
- 필요에 따라 메서드를 오버라이딩해 원하는 동작을 커스터마이징할 수 있다.
기본 예시 코드
1. ViewSet 사용 예시
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
- ModelViewSet을 사용하면 기본적으로 GET, POST, PUT, DELETE 메서드가 자동으로 제공된다.
- queryset과 serializer_class를 정의하면 나머지 작업은 DRF가 처리한다.
2. Router 연동
urls.py에서 router를 사용해 ViewSet을 등록한다.
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')
urlpatterns = router.urls
- router.register()를 통해 BookViewSet을 자동으로 URL 패턴과 연결한다.
- 결과 URL 예시:
- GET /books/ → 책 목록 조회
- POST /books/ → 책 생성
- GET /books/{id}/ → 특정 책 조회
- PUT /books/{id}/ → 책 수정
- DELETE /books/{id}/ → 책 삭제
ViewSet 사용 시 장점
- 코드 재사용성: 동일한 리소스를 처리하는 기능을 하나의 클래스에 모아 관리할 수 있다.
- 라우팅 자동화: URL 설정을 따로 작성하지 않아도 router가 알아서 처리해준다.
- 빠른 개발: 기본적인 CRUD 작업은 거의 자동화되므로 개발 속도가 빨라진다.
ViewSet과 APIView 차이점
- APIView는 HTTP 메서드별로 함수를 하나씩 정의해야 한다.
- ViewSet은 함수 대신 클래스 단위로 모든 메서드를 관리하며, 라우팅을 자동화해준다.
APIView 예시
class BookAPIView(APIView):
def get(self, request):
# 목록 조회
pass
def post(self, request):
# 생성
pass
ViewSet 예시
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
→ ModelViewSet을 사용하면 GET/POST 등의 메서드를 직접 정의할 필요가 없다.
결론
ViewSets는 RESTful API에서 코드 중복을 줄이고 URL 라우팅을 자동화해주는 강력한 기능이다. 특히 CRUD 작업이 필요한 경우 ModelViewSet을 사용하면 코드 작성 시간을 획기적으로 줄일 수 있다.
ViewSets와 Router를 함께 사용하면 간결하고 효율적인 API 개발이 가능하다.
728x90
반응형
'코딩' 카테고리의 다른 글
| 메소드 > perform_create(); 생성을 실행하라! (0) | 2024.12.17 |
|---|---|
| Reverse URL 만들기 < viewsets + router 환경에서 (2) | 2024.12.16 |
| Authentication, Authorization; 에버랜드 입장권과 이용권 (2) | 2024.12.16 |
| Bearer 토큰 (0) | 2024.12.14 |
| rest.api 토큰 이터페이스 구현 (1) | 2024.12.14 |
