페이징 및 필터링
Django Rest Framework(DRF)에서 페이징과 필터링은 대량의 데이터를 효율적으로 관리하고 제공하는 데 중요한 역할을 합니다. 페이징은 데이터를 페이지로 분할하여 제공하며, 필터링은 특정 조건을 기반으로 데이터를 제한합니다.
페이지네이션의 구현
페이지네이션은 대량의 데이터를 여러 페이지로 분할하여 제공하는 기능입니다. DRF는 여러 가지 페이지네이션 스타일을 제공하며, 커스텀 페이지네이터를 작성할 수도 있습니다.
- 기본 페이지네이션 설정
# settings.py
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.PageNumberPagination',
위 설정에서 PageNumberPagination 클래스를 사용하여 페이지네이션을 활성화하고, 페이지당 10개의 항목을 제공합니다.
- 페이지네이션 적용
# pagination.py 파일
from rest_framework.pagination import PageNumberPagination
class CustomPagination(PageNumberPagination):
page_size = 5
page_size_query_param = 'page_size'
max_page_size = 100
# views.py 파일
from rest_framework import generics
from .models import Animal
from .serializers import AnimalSerializer
from .pagination import CustomPagination
class AnimalListView(generics.ListAPIView):
queryset = Animal.objects.all()
serializer_class = AnimalSerializer
pagination_class = CustomPagination
CustomPagination 클래스를 작성하여 페이지네이션 설정을 커스터마이징하고, ListView에서 pagination_class 속성을 사용하여 페이지네이션을 적용합니다.
필터링 옵션과 사용 방법
터링은 특정 조건을 기반으로 데이터를 제한하는 기능입니다. DRF는 다양한 필터링 옵션을 제공하며, 커스텀 필터를 작성할 수도 있습니다.
- 기본 필터링 설정
# settings.py
'DEFAULT_FILTER_BACKENDS':
['django_filters.rest_framework.DjangoFilterBackend'],
위 설정에서 DjangoFilterBackend를 사용하여 필터링을 활성화합니다.
- 필터링 적용
**# views.py**
from rest_framework import generics
from .models import Animal
from .serializers import AnimalSerializer
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
class AnimalListView(generics.ListAPIView):
queryset = Animal.objects.all()
serializer_class = AnimalSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['name', 'species']
search_fields = ['name', 'species']
ordering_fields = ['name', 'species']
Filter 클래스를 작성하여 필터링 설정을 커스터마이징하고, ListView에서 Filter_class 속성을 사용하여 필터링을 적용합니다.이렇게 페이징과 필터링을 활용하면, 대량의 데이터를 효율적으로 관리하고 제공할 수 있으며, 사용자에게 유용한 데이터 탐색 기능을 제공할 수 있습니다.
5.10 예외 처리
Django Rest Framework(DRF)에서의 예외 처리는 API의 안정성과 사용자 경험(UX)을 향상시키는 중요한 부분입니다. DRF는 기본적으로 몇 가지 예외 클래스를 제공하며, 이들을 통해 다양한 HTTP 상태 코드와 함께 오류를 관리할 수 있습니다. 예외 처리를 잘 구현함으로써 API 사용자에게 명확하고 유용한 오류 메시지를 제공할 수 있습니다.
DRF에서의 예외 처리 메커니즘
DRF의 예외 처리 시스템은 주로 APIException 클래스를 기반으로 합니다. APIException과 그 하위 클래스들은 다양한 종류의 HTTP 상태 코드를 표현합니다. 주요 예외 클래스로는 다음과 같은 것들이 있습니다.
- NotFound: 404 Not Found
- 요청된 리소스가 서버에 존재하지 않을 때 사용합니다.
- PermissionDenied: 403 Forbidden
- 사용자가 요청을 수행할 권한이 없을 때 발생합니다. 예를 들어, 로그인하지 않은 사용자가 보호된 리소스에 접근하려 할 때 이 예외가 사용될 수 있습니다.
- ValidationError: 400 Bad Request
- 클라이언트에서 제공된 데이터가 유효하지 않을 때 발생합니다. 예를 들어, 필수 필드가 누락되었거나 데이터 형식이 잘못된 경우 이 예외를 사용할 수 있습니다.
예외 처리의 중요성
예외 처리는 API의 안정성을 보장하고 사용자 경험을 개선하는 데 중요한 역할을 합니다. 명확한 오류 메시지와 상태 코드는 클라이언트 개발자가 API를 더 쉽게 이해하고 사용할 수 있도록 도와줍니다. 또한, 예상치 못한 서버 오류로부터 시스템을 보호하고, 오류 발생 시 적절한 로깅과 대응을 가능하게 합니다.
커스텀 예외 처리
DRF는 기본 제공되는 예외 외에도 사용자가 커스텀 예외를 정의할 수 있도록 지원합니다. 커스텀 예외를 사용하면 특정 애플리케이션에 특화된 예외 상황을 더 세밀하게 다룰 수 있습니다.
예제 코드
여기에서는 NotFound, PermissionDenied, ValidationError 예외를 다루겠습니다.
#views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import NotFound, PermissionDenied,
ValidationError
from .models import Animal
# Animal 상세 정보를 반환하는 API
class AnimalDetailView(APIView):
def get(self, request, pk):
try:
animal = Animal.objects.get(pk=pk)
except Animal.DoesNotExist:
raise NotFound(detail="Animal not found.")
return Response({
"name": animal.name,
"species": animal.species,
"age": animal.age
})
# Animal 추가하는 API
class AnimalAddView(APIView):
def post(self, request):
if not request.user.is_authenticated:
raise PermissionDenied(detail="Authentication required.")
name = request.data.get('name')
species = request.data.get('species')
age = request.data.get('age')
if not all([name, species, age]):
raise ValidationError("All fields 'name', 'species', and 'age'
are required.")
animal = Animal.objects.create(name=name, species=species, age=age)
return Response({
"id": animal.id,
"name": animal.name,
"species": animal.species,
"age": animal.age
})
#urls.py
from django.urls import path
from myapp import views
urlpatterns = [
path('animals/<int:pk>/', views.AnimalDetailView.as_view(),
name='animal-detail'),
path('animals/add/', views.AnimalAddView.as_view(), name='animal-add'),
]
예외 처리를 통해 API 사용자에게 유익한 피드백을 제공하고, 오류 발생 시 적절한 HTTP 응답을 반환하는 것은 RESTful API를 설계하는 데 있어 중요한 측면입니다.
지금까지 DRF View 파트를 보았습니다. 상기 내용과 같이 DRF의 클래스 기반 View, 직관적인 요청 처리, 그리고 다양한 예외 처리 메커니즘은 Django 개발자들에게 API 개발의 복잡성을 줄이면서도 유연한 설계를 가능하게 합니다. 이번 파트에서 여러분들이 DRF View에 대해 깊게 알아보는 시간이 되었기를 바랍니다.
'BackEnd' 카테고리의 다른 글
카페에서 와이파이 QR 코드 이미지 비밀번호 추출 및 알아내기 (1) | 2024.09.25 |
---|---|
PowerShell 명령어 인식 오류 해결 방법: 초보자도 쉽게 따라 할 수 있는 팁 (0) | 2024.09.24 |
DRF 설명서 개념 때려잡기 : 믹스인(Mixins), 인증과 권한 (0) | 2024.09.18 |
[DRF 설명서 개념 따라잡기] DRF View와 ViewSet (0) | 2024.09.17 |
[DRF 설명서 개념따라잡기] FBV와 CBV 언제 어떤 것을 사용해야 할까? (1) | 2024.09.16 |