본문 바로가기
TTL/13주차 ~ 16주차 TIL (11.21 ~ 12.16)

2022-11-25 TIL (DRF pagination)

by dev_junseok 2022. 11. 29.

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를 통해 마지막 객체를 물고있는 것을 볼 수 있다.