Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- flask
- docker
- CS
- 티스토리챌린지
- 세션(Session)
- web
- github
- 개발공부
- 오블완
- 파이썬
- ERD
- nginx
- SQL
- django
- 장고
- git
- 도커
- Doker
- 연습
- Python
- Wil
- 코딩테스트
- viewsets
- NoSQL
- 쿠키(cookie)
- 아티클 스터디
- Til
- 자료구조
- redis
- JWT
Archives
- Today
- Total
SteadyDrills
장고(Django) ViewSets 본문
250106
ViewSet이란?
Django REST Framework (DRF)에서 하나의 클래스를 이용해 여러 메서드를 처리하기 위해 만들어진 것이다.RESTful API의 동작을 중심으로 설계되었기 때문에 HTTP 메서드(GET, POST, PUT 등)에 대해 동일 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 처리할 수 있다. 이것을 통해 코드의 중복을 줄이고 유지 보수를 용이하게 할 수 있다.
* ViewSet을 사용할 때는 Router를 함께 사용하는 것이 일반적이며, Router는 URLConf를 자동으로 생성해 주어 편리하게 API 엔드포인트를 관리할 수 있도록 도와준다.
ViewSet의 종류
1. ViewSet
- 특징
가장 기본적인 ViewSet이며, 명시적으로 액션을 정의해야 한다. 즉, list(), create(), retrieve(), update(), partial_update(), destroy() 등의 메서드를 직접 구현해야 한다. 가장 유연하지만, 가장 많은 코드를 작성해야 한다는 특징이 있다. - 예시
from rest_framework import viewsets
from rest_framework.response import Response
from .models import User
from .serializers import UserModelSerializer
class UserModelViewSet(viewsets.ViewSet):
#유저 목록조회
def list(self, request):
queryset = User.objects.all()
serializer = UserModelSerializer(queryset, many=True)
return Response(serializer.data)
#유저 생성
def create(self, request):
serializer = UserModelSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
def retrieve(self, request, pk=None):
return Response({"message": f"GET 요청 - 객체 {pk} 조회"})
# ... 다른 액션들 (retrieve, update, destroy 등) ...
2. GenericViewSet
- 특징
ViewSet을 확장하여 get_queryset()과 같은 일반적인 뷰 속성 및 기능을 제공한다. GenericAPIView의 기능을 ViewSet에 통합한 형태라고 볼 수 있으며 액션은 명시적으로 정의해야 하지만, 쿼리셋 관리 등 기본적인 기능을 활용이 더 편리하다. - 예시
from rest_framework import viewsets
from rest_framework import generics
from .models import User
from .serializers import UserModelSerializer
class MyModelViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.CreateModelAPIView):
queryset = User.objects.all()
serializer_class = UserModelSerializer
# list(), create() 액션은 generics의 Mixin을 통해 제공됨
# 필요하다면 다른 액션들을 추가적으로 정의할 수 있음
3. ModelViewSet
- 특징
GenericViewSet을 확장하여 queryset과 serializer_class 속성을 제공하며, 기본적인 CRUD (Create, Read, Update, Delete) 작업을 위한 액션 (list(), create(), retrieve(), update(), partial_update(), destroy())이 이미 구현되어 있다. 가장 많이 사용되는 ViewSet이며, 최소한의 코드로 대부분의 API 기능을 구현할 수 있다. - 예시
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
4. ReadOnlyModelViewSet
- 특징
ModelViewSet과 유사하지만, 읽기 전용 작업 (list()와 retrieve())만 제공한다. 데이터를 생성, 수정, 삭제하는 기능은 제공하지 않는다. - 예시
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
ViewSet 선택 시 주의점
- 매우 유연한 제어가 필요한 경우 - ViewSet을 사용. 모든 로직을 직접 구현해야 하므로 자유도가 높기 때문이다.
- 기본적인 CRUD 기능을 구현하는 경우 - ModelViewSet을 사용. 최소한의 코드로 대부분의 기능을 구현할 수 있다.
- 읽기 전용 API를 구현하는 경우
- ReadOnlyModelViewSet을 사용. 주로 쇼핑몰 제품 목록 API, 날씨 정보 API 등
데이터가 외부에서 갱신되거나 삭제, 수정이 필요 없는 경우에 사용 - 일부 기능만 커스터마이징 하거나, 믹스인을 활용하는 경우: GenericViewSet을 사용
Viewsets의 장단점
장점
- 코드 중복 감소
동일한 모델에 대한 여러 작업을 (목록 조회, 생성, 수정, 삭제 등) 하나의 클래스에서 처리할 수 있으므로 코드 중복이 감소됨. → 가독성을 높이고 유지 보수를 용이 - 간결한 코드
ViewSet을 사용하면 필요한 코드가 줄어들어 개발 속도를 향상할 수 있다. - 일관된 URL 구조
Router를 함께 사용하면 URL 패턴이 자동으로 생성되므로, API 엔드포인트의 일관성을 유지 가능. → 가독성 향상 - RESTful API 설계에 용이
ViewSet은 RESTful 원칙에 따라 설계되었기 때문에, RESTful API를 구현하기 용이함.
단점
- 유연성 부족 (복잡한 커스텀의 경우)
기본적인 CRUD 작업 외에 복잡한 로직이나 추가적인 커스텀이 필요한 경우에는 ViewSet의 유연성이 부족할 수 있다. 이러한 경우에는 APIView를 사용하는 것이 더 적합함. - 암묵적인 동작
Router를 사용하여 URL이 자동으로 생성되기 때문에, URL 패턴이 명시적으로 드러나지 않을 수 있다. → 구조 파악에 불리할 수 있음. - 과도한 추상화
ViewSet은 많은 부분을 추상화하고 있기 때문에, 내부 동작을 정확히 이해하지 않고 사용하면 예기치 않은 문제가 발생할 수 있음. → 디버깅이 어려울 수 있음. - 모든 상황에 적합하지 않음
특정 기능만 제공하는 API의 경우에는 ViewSet을 사용하는 것이 오히려 불필요한 복잡성을 더할 수 있다.
Viewsets의 액션(Action)
액션(Action) - 특정 작업을 수행하는 메서드. 일반적인 뷰에서 HTTP 메서드 핸들러(get(), post(), put(), delete())를 정의하는 것과 달리, ViewSet에서는 이러한 액션을 정의하여 API 엔드포인트를 구성한다.
액션 | HTTP메서드 | 설명 |
list() | GET | 목록 조회. 컬렉션에 대한 GET 요청을 처리합니다. |
retrieve() | GET | 상세 조회. 특정 항목에 대한 GET 요청을 처리합니다. |
create() | POST | 생성. 새로운 항목을 생성하기 위한 POST 요청을 처리합니다. |
update() | PUT | 전체 수정. 특정 항목의 모든 필드를 수정하기 위한 PUT 요청을 처리합니다. |
partial_update() | PATCH | 부분 수정. 특정 항목의 일부 필드만 수정하기 위한 PATCH 요청을 처리합니다. |
destroy() | DELETE | 삭제. 특정 항목을 삭제하기 위한 DELETE 요청을 처리합니다. |
Viewsets의 작동 방식
- 클라이언트에서 API 요청이 발생하면, URLConf에서 해당 요청을 처리할 뷰를 검색.
- ViewSet을 사용하는 경우, 라우터가 URL 패턴에 따라 적절한 ViewSet과 액션을 결정.
- ViewSet에 포함된 APIView 또는 GenericAPIView의 as_view() 메서드가 호출되어 HTTP 메서드에 맞는 액션 함수를 실행.
- 액션 함수는 GenericAPIView 또는 APIView의 기능을 활용하여 요청을 처리하고 응답을 생성.
공식 문서: https://www.django-rest-framework.org/api-guide/viewsets/
Viewsets - Django REST framework
viewsets.py After routing has determined which controller to use for a request, your controller is responsible for making sense of the request and producing the appropriate output. — Ruby on Rails Documentation Django REST framework allows you to combine
www.django-rest-framework.org
'웹개발' 카테고리의 다른 글
로컬 스토리지(LocalStorage)란? (0) | 2025.01.13 |
---|---|
장고(Django)의 Routers (0) | 2025.01.10 |
웹의 세션, 쿠키, 캐시 (0) | 2025.01.04 |
레디스 명령어 모음 (0) | 2024.12.23 |
장고의 세션 저장 원리 (0) | 2024.12.19 |