[JPA] Pagination

Yennie·2024년 6월 27일

JPA

목록 보기
18/19

페이지네이션이란?

페이지네이션은 특정한 정렬기준 + 필요한 개수의 조건에 맞추어 데이터를 가져오는 것을 의미한다. 데이터를 한번에 가져오는 것 (예를 들어 총 데이터값이 100만개가 넘는다면 전부 가져오는 건 성능 부하를 가져온다)보다 데이터를 조금씩 (20~100개씩) 나누어 가져오고 사용자가 원하는 경우 다음 데이터를 가져오게 되면 더 빠르고 사용경험도 개선되기에 사용하는 것이 pagination이다.

페이지네이션 처리 방법은 크게 2가지가 있다.
1. 오프셋 기반 페이지네이션
2. 커서 기반 페이지네이션

오프셋 기반 페이지네이션

DB의 limit, offset 쿼리를 사용하여 구분하여 '페이지' 단위로 구분하여 요청/응답하게 구현

  • 비교적 구현이 간단하고, 원하는 페이지로 쉽게 뛰어넘어갈 수 있다.
  • 데이터가 몇번째에 있는지 집중한다.
SELECT * FROM product LIMIT {페이지 당 자료의 개수} OFFSET {오프셋} 
SELECT * FROM product LIMIT 40 OFFSET 0;
// 1-40까지 출력
SELECT * FROM product LIMIT 40 OFFSET 40; // 40-80까지 출력

오프셋 방식은 일반적으로 쿼리가 복잡하지 않고 다양한 정렬방식을 쉽게 구현할 수 있다는 장점이 있다.

그러나, 페이지의 뒤로 갈 수록 쿼리의 속도가 매우 느려지고, 데이터의 잦은 추가와 삭제가 이루어졌을 때 누락과 중복이 발생할 수 있다. 따라서 자주 바뀌지 않는 적은 양의 데이터에 대해서는 오프셋 방식이 더 좋다.

커서 기반 페이지네이션

어떠한 레코드를 가르키는 포인터인 커서가 있고, 이 커서가 가르키는 레보다부터 일정 개수만큼 가져오는 방식이다.

SELECT * FROM product WHERE id > {기준값} LIMIT 40;
SELECT * FROM product WHERE id > 80 LIMIT 40; // 81~120
SELECT * FROM product WHERE id > 120 LIMIT 40; // 121-160

커서 기반 페이지네이션은 페이지의 뒤로 갈수록 쿼리 속도가 느려지지 않고, 데이터가 자주 변경되더라도 일관성을 유지할 수 있다는 장점이 있다.

그러나 중복이 발생할 수있는 컬럼을 커서로 사용하면 데이터 손실이 발생할 수 있다.

요약

  • 오프셋 기반 페이지네이션은 구현이 간단하고 다양한 정렬 방식을 쉽게 적용할 수 있지만, 데이터가 많아질수록 성능이 저하되고 데이터 추가/삭제 시 문제가 발생할 수 있다.
  • 커서 기반 페이지네이션은 성능이 일정하고 데이터 변경에도 일관성을 유지할 수 있지만, 중복된 데이터를 커서로 사용할 경우 주의가 필요하다.

참고
https://velog.io/@ygreenb/Paginationoffset-vs-cursor

https://betterdev.tistory.com/17

profile
PM | Aspiring SWE | linkedin.com/in/emilyyeeun

0개의 댓글