페이지네이션은 특정한 정렬기준 + 필요한 개수의 조건에 맞추어 데이터를 가져오는 것을 의미한다. 데이터를 한번에 가져오는 것 (예를 들어 총 데이터값이 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
커서 기반 페이지네이션은 페이지의 뒤로 갈수록 쿼리 속도가 느려지지 않고, 데이터가 자주 변경되더라도 일관성을 유지할 수 있다는 장점이 있다.
그러나 중복이 발생할 수있는 컬럼을 커서로 사용하면 데이터 손실이 발생할 수 있다.