백으로 구현하는 페이지네이션

caynny·2025년 1월 23일

생소한개념

목록 보기
5/5

백으로 구현하는 페이지네이션을 알지 못해 쓰는 글


참고 블로그
https://gyeongsuuuu.tistory.com/67
(아주 설명이 잘 되어있음 따봉)


백에서의 페이지네이션

실제 데이터를 분할하고, 필요한 데이터만 전송하는 일을 담당한다.

페이지네이션을 구현하는 여러 방법 존재

  • 오프셋 기반 페이지네이션
  • 커서 기반 페이지네이션

1. 오프셋 기반 페이지네이션

Offset-based Pagination
SQL의 LIMIT과 OFFSET을 사용하여 특정 범위의 데이터를 가져오는 방식이다.

데이터베이스에 LIMITOFFSET을 사용하여 특정 범위의 데이터를 가져온다.

예시코드

SELECT *
FROM tb_list
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
  • LIMIT 10: 한 번에 10개의 데이터만 가져온다.
  • OFFSET 20: 데이터의 21번째 항목부터 가져온다.

장점

  • 간단하고 직관적이다.
  • 페이지를 변경할 때 OFFSET 값만 바꾸면 된다.
  • 대부분위 관계형 데이터베이스에서 지원한다.

단점

  • 서능 저하 가 생길 수 있다.
  • 데이터가 실시간으로 추가/삭제되면 페이지 번호의 정확성이 떨어질 수 있다.

단점 1) 오프셋 페이지네이션의 성능 저하 문제

오프셋은 요청한 위치까지 데이터를 건너뛰어야하기 때문에, 모든 데이터 중 앞부분을 순차적으로 읽어야한다.

  • 예를 들어 OFFSET 1000이라 하면, 데이터베이스는 1000개의 행을 실제로 가져오지는 않더라고 일단 읽어버리고, 이후의 데이터만 반환한다.


    결론
    OFFSET이 클수록 데이터베이스가 스캔해야 하는 데이터의 양이 많아져서 시간이 증가하고 리소스를 낭비한다.
    (데이터의 양이 많을수록 쿼리 시간이 늘어난다.)

단점 2) 오프셋 페이지네이션의 일관성 문제

데이터가 실시간으로 추가되거나 삭제되면 OFFSET 기반으로 접근한 데이터가 정확하지 않을 가능성이 생긴다.

  • 예를 들어 데이터를 조회하던 도중에 데이터가 중간에 삽입되면, page1에서 조회했던 정보가 page2로 밀려나와(page1에 새로운 데이터가 삽입되어),
    결과적으로 page1에서 봤던 내용인데 page2에 또 있네? 상황이 발생할 수 있다.
    ( 즉, 일관성이 없는 상황이 발생하는 것 )

이런 단점들을 해소할 수 있는 방법으로 커서 기반 페이지네이션 이 제안된다.



2. 커서 기반 페이지네이션

Cursor-based Pagination
이전 페이지의 마지막 데이터를 기준으로 다음 페이지를 가져오는 방식이다.

  • 따라서 클라이언트가 다음 페이지를 요쳥하려면 이전에 받은 마지막 커서 값(id 값 등)을 포함해야 한다.

예사코드

SELECT * 
FROM tb_announcement
WHERE created_at < '2025-01-23T12:00:00Z'
ORDER BY created_at DESC
LIMIT 10;
  • '2025-01-23T12:00:00Z'이 커서 역할을 한다.
  • 반환된 데이터에서 마지막 항목의 created_at 값을 다음 쿼리의 기준으로 사용한다.

장점

  • OFFSET 처럼 데이터를 건너뛰지 않고, 필요한 데이터만 정확히 가져올 수 있다.
  • 일관성이 보장된다. (실시간으로 데이터가 추가/삭제되더라도 영향을 받지 않는다. )


cf) 메모리 기반 페이지네이션

메모리에 모든 데이터를 올린 뒤 필요한 데이터를 슬라이싱 하는 방식

  • 오프셋 기반, 커서 기반은 데이터베이스 레벨에서 데이터를 특정 기준으로 제한을 걸어 가져오는 방식으로 메모리 기반 페이지네이션과 다르다.
profile
공부해볼게용

0개의 댓글