TIL126. DRF : Pagination 적용하기

ID짱재·2022년 2월 20일
0

Django REST Framework

목록 보기
9/10
post-thumbnail

📌 이 포스팅에서는 Django Rest Framework에서 제공하는 PageNumberPagination, LimitOffsetPagination, CursorPagination를 적용시키는 방법에 대해 정리하였습니다.



🌈 Pagination 적용하기

🔥 PageNumberPagination

🔥 LimitOffsetPagination

🔥 CursorPagination



1. PageNumberPagination

🤔 전역으로 Page 기반 Pagination 적용시키는 방법

✔️ DRF에서는 Pagniation을 기본 기능이 클래스로 만들어져있다. 이를 사용하면 손쉽게 Pagination 구현이 가능하다.

✔️ 앱 별로 Pagination을 지정할 수도있고, settings.py로 가서 전역으로 적용시키는 것도 가능하다.

✔️ App 등록 부분 뒤쪽에 아래와 같이, PageNumberPagination을 Default로 지정하고, PAGE_SIZE를 정수로 지정한다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS' : 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE' : 2,  # 👈 1페이지당 보여줄 갯수
}

✔️ 아래와 같이, count에는 총 객체의 수량이 적혀있고, next와 previous 값에 페이지에 대한 엔드포인트를 확인 가능하다.

✔️ 또한 PageNumberPagination은 아래와 같이 page라는 query paameter를 이용해, 페이지를 제어한다.

🤔 View 별로 Page 기반 Paginaton 적용시키는 방법

✔️ settings.py를 통해 전역로 Default Pagination을 지정한 상태에서, API 별로 Pagination을 설정할 수 있다.

✔️ 현재 Default로 전역에 페이지 사이즈가 2인 상태에서, 해당 View에서 사이즈를 3으로 오버라이딩하는 방법은 아래와 같다.

✔️ 우선 PageNumberPagination을 import한 뒤, Pagination을 위한 StudentPagination 만들고 사이즈를 지정한다.

✔️ StudentPagination의 규칙데로 Pagination을 적용한 View Class 내 pagination_class에 이를 매핑한다.

from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination # 👈 페이지 기반 파지네이션 import
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
# StudentPagination # 👈 개별 View에 적용시킬 Pagination Class
class StudentPagination(PageNumberPagination): # 👈 PageNumberPagination 상속
    page_size = 3
# StudentViewSet    
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination # 👈 pagination_class 값에 매핑



2. LimitOffsetPagination

🤔 View 별로 Limit&Offset 기반 Paginaton 적용시키는 방법

✔️ 전역으로 LimitOffsetPagination을 지정하는 방법은 settings.py에서 위와 같이 Default Pagination 설정으로 가능하다.

✔️ 뿐만아니라, API별로도 지정할 수 있는데 OffsetLimitPagination의 경우 'default_limit'을 수량을 제어 가능하다.

✔️ default_limit이 지정되지 않으면, settings.py에 Default로 지정된 PAGE_SIZE 값이 적용된다.

from rest_framework import viewsets
from rest_framework.pagination import LimitOffsetPagination
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
# StudentPagination
class StudentPagination(LimitOffsetPagination):
    default_limit = 4
# StudentViewSet
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination



3. CursorPagination

🤔 View 별로 Cursor 기반 Paginaton 적용시키는 방법

✔️ Cursor 기반 Pagination은 CRUD가 빈번하게 이뤄질 경우, 중복으로 객체가 노출되는 것을 방지한다.

✔️ 왜냐하면, 특정 정렬 순서에 따라 마지막으로 노출된 객체를 기억하고 있고, 그 객체로부터 갯수를 제공하기 때문에 그 사이에 객체의 생성 또는 삭제가 자주 이뤄진다해도 객체를 가져오는데 있어 중복 또는 손실을 일으키지 않는다.

✔️ ordering 속성을 통해, 정렬 기준을 생성할 수 있는데 별도로 지정하지 않는다면 default로 created_at이다.

✔️ 현재 Model에 created_at 필드가 존재하지 않기 때문에 임의로 id값으로 정렬을했다.

✔️ Cursor 기반 Pagination 또한 settings.py를 통해 전역으로도 지정 가능하다.

✔️ cursor라는 query parameter를 통해 마지막 객체를 물고있는 것을 볼 수 있다.

from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
# StudentPagination
class StudentPagination(CursorPagination):
    page_size = 3
    ordering = 'id'
# StudentViewSet
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination

profile
Keep Going, Keep Coding!

0개의 댓글