Published on

Limit-Offset 페이지네이션 쉽게 이해하기

Authors

웹 개발에서 데이터를 효율적으로 관리하고 사용자에게 표시하는 방법은 매우 중요합니다.

특히 데이터가 많은 경우, 모든 데이터를 한 번에 로드하는 것은 (상황에 따라 다르지만) 대부분 비효율적 입니다.

이 문제를 해결하는 한 가지 방법이 바로 페이지네이션입니다.

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를 사용하는 경우, 이 기능을 쉽게 구현하고 사용할 수 있습니다.

하지만 대규모 데이터셋을 다룰 때는 성능 문제를 고려하여 적절한 페이지네이션 방법을 선택하는 것이 중요합니다.

  • hongreat 블로그의 글을 봐주셔서 감사합니다!^^
  • 내용에 잘못된 부분이나 의문점이 있으시다면 댓글 부탁 & 환영 합니다~!
  • (하단의 버튼을 누르시면 댓글을 보거나 작성할 수 있습니다.)
Buy Me A Coffee