📌 이 포스팅에서는 Django Rest Framework에서 제공하는 PageNumberPagination, LimitOffsetPagination, CursorPagination를 적용시키는 방법에 대해 정리하였습니다.
🔥 PageNumberPagination
🔥 LimitOffsetPagination
🔥 CursorPagination
✔️ 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를 이용해, 페이지를 제어한다.
✔️ 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 값에 매핑
✔️ 전역으로 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
✔️ 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