- Published on
Limit-Offset 페이지네이션 쉽게 이해하기
- Authors
- Name
- hongreat
- ✉️hongreat95@gmail.com
웹 개발에서 데이터를 효율적으로 관리하고 사용자에게 표시하는 방법은 매우 중요합니다.
특히 데이터가 많은 경우, 모든 데이터를 한 번에 로드하는 것은 (상황에 따라 다르지만) 대부분 비효율적 입니다.
이 문제를 해결하는 한 가지 방법이 바로 페이지네이션입니다.
1. Limit-Offset 페이지네이션의 개념
Limit-Offset 페이지네이션은 데이터를 페이지 단위로 분할하여 표시하는 방법입니다. 이 방법은 다음 두 가지 주요 구성 요소로 이루어집니다
1.1. Limit
한 번에 표시될 데이터의 최대 개수를 지정합니다.
LIMIT 10 은 한 페이지에 최대 10개의 데이터를 표시하겠다는 의미입니다.
1.2. Offset
시작점을 지정합니다. 즉, 어느 위치에서부터 데이터를 가져올 것인지를 결정합니다.
OFFSET 10은 첫 10개의 데이터를 건너뛰고 그 다음 데이터부터 시작하겠다는 의미입니다.
2. Limit-Offset 페이지네이션의 예시
데이터베이스에 100개의 레코드가 있고, 페이지 당 10개의 레코드를 표시하려는 경우 입니다.
SQL 문으로 페이지네이션이 가능합니다.
- 첫 번째 페이지
SELECT * FROM table LIMIT 10 OFFSET 0 (첫 10개의 레코드를 보여줍니다)
- 두 번째 페이지
SELECT * FROM table LIMIT 10 OFFSET 10 (11번째부터 20번째 레코드를 보여줍니다)
- 세 번째 페이지
SELECT * FROM table LIMIT 10 OFFSET 20 (21번째부터 30번째 레코드를 보여줍니다)
이와 같이, 사용자가 다른 페이지를 요청할 때마다 Offset 값을 변경하여 해당 페이지에 맞는 데이터를 조회할 수 있습니다.
3. Django REST Framework에서의 구현
Django REST Framework를 사용하는 경우, 페이지네이션을 매우 쉽게 구현할 수 있습니다.
전역 설정과 뷰 설정 두 가지 방법을 통해 페이지네이션을 적용할 수 있습니다.
3.1. 전역 설정 (settings.py)
settings.py 에서는 전체 프로젝트에 걸쳐 기본 페이지네이션 설정을 정의할 수 있습니다.
예를 들어, 다음과 같이 설정할 수 있습니다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10
}
이 설정은 기본적으로 모든 뷰에 적용되며, 페이지당 10개의 아이템을 반환하도록 설정합니다.
3.2. 뷰 설정
특정 뷰에서 페이지네이션을 다르게 설정하거나 커스텀하고 싶은 경우, 뷰에서 직접 설정할 수 있습니다.
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.generics import ListAPIView
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelListView(ListAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
pagination_class= LimitOffsetPagination # 필요한 경우 다른 설정 추가
이렇게 설정하면, 해당 뷰는 limit 과 offset 쿼리 파라미터를 통해 클라이언트가 요청하는 대로 데이터를 반환합니다.
4. 성능 고려 사항
Limit-Offset 페이지네이션은 간단하고 이해하기 쉽지만, 대규모 데이터셋의 경우 성능 문제가 발생할 수 있습니다.
특히 Offset 값이 큰 경우, 데이터베이스가 많은 양의 데이터를 건너뛰어야 하므로 쿼리 성능이 저하될 수 있습니다.
이러한 경우, 커서 기반 페이지네이션(Cursor-based pagination)과 같은 다른 방법을 고려하는 것이 좋습니다.
커서 기반 페이지네이션은 마지막으로 액세스한 데이터의 위치를 기억하여 다음 데이터를 효율적으로 로드할 수 있는 방법입니다.
Limit-Offset 페이지네이션은 웹 개발에서 데이터를 효과적으로 관리하고 사용자에게 적절한 양의 데이터를 표시하는 데 매우 유용한 도구입니다.
Django REST Framework를 사용하는 경우, 이 기능을 쉽게 구현하고 사용할 수 있습니다.
하지만 대규모 데이터셋을 다룰 때는 성능 문제를 고려하여 적절한 페이지네이션 방법을 선택하는 것이 중요합니다.