페이지네이션
페이지네이션은 대량의 데이터를 작은 일부분으로 분할하여 사용자에게 보여주는 방식이다. 이를 통해 사용자는 한번에 모든 데이터를 로드하지 않고도 필요한 만큼의 데이터만 로드하여 랜더링할 수 있다. 페이지네이션을 사용할 경우 서버와 클라이언트 간의 트래픽 부하가 감소하여 클라이언트는 빠르게 데이터를 전달받을 수 있고 이로 인해 적절량의 데이터를 화면에 랜더링할 수 있다. 이러한 과정속에 불필요한 리소스를 줄여 서버 비용을 절감시킬 수 있으며 사용자는 대기 시간 없이 빠르게 화면을 볼 수 있어 사용자 경험에도 좋다.
페이지네이션을 하지 않을 경우
대량의 데이터를 다루는 경우, 모든 데이터를 한 번에 불러오 경우 성능에 부정적인 영향을 줄 수 있다. 이는 서버 리소스 비용 증가와 네트워크 대역폭을 낭비하고 사용자가 데이터를 기다리는 시간을 증가시킬 수 있다.
페이지네이션을 하지 않을 경우 단점은 명확하기 때문에 백오피스(관리자페이지)에서도 적절량의 데이터만을 보여줄 수 있도록 해야한다.
커서 기반 페이지네이션
페이지의 끝에 도달할 때마다 이전 페이지의 마지막 항목에 대한 커서를 사용하여 다음 페이지의 데이터를 가져오는 방식이다.
이 방법은 데이터의 순서가 변경되더라도 안정적으로 작동하며, 대량의 데이터를 처리할 때 효율적이다.
예를 들어, 데이터베이스에서는 고유 식별자(Auto Increment), created_time 를 사용하여 커서를 구성할 수 있다.
-- 사용자가 현재 페이지의 끝에 있는 항목의 ID를 가지고 있다고 가정 (Auto Increment)
SET @cursor = {현재 페이지의 끝에 있는 항목의 ID};
-- 페이지에 표시될 항목의 개수
SET @pageSize = {페이지당 항목 수};
-- 현재 페이지의 끝에 있는 항목보다 크거나 같은 ID를 가진 항목을 가져옴
SELECT *
FROM articles
WHERE id >= @cursor
ORDER BY id
LIMIT @pageSize;
오프셋 기반 페이지네이션
각 페이지의 시작 위치를 나타내는 오프셋 값을 사용하여 데이터를 가져온다. 이 방법은 페이지를 이동할 때마다 오프셋을 계산하여 새로운 페이지의 데이터를 가져오므로, 데이터가 추가되거나 삭제되는 경우 오프셋 값이 변경된다. 이는 데이터의 정렬이 변경되면 예상치 못한 결과를 발생시킬 수 있다. 또한, 오프셋이 큰 경우 성능 저하의 원인이 되기도 한다.
-- 현재 페이지 번호
SET @pageNumber = {현재 페이지 번호};
-- 페이지당 항목 수
SET @pageSize = {페이지당 항목 수};
-- 오프셋 계산
SET @offset = (@pageNumber - 1) * @pageSize;
-- 페이지에 해당하는 항목을 가져옴
SELECT *
FROM articles
ORDER BY id
LIMIT @pageSize OFFSET @offset;
결론
커서 기반과 오프셋 기반 페이지네이션은 각각 장단점이 있으며, 비즈니스 요구사항에 따라 적절한 방법을 선택해야 한다. 커서 기반 페이지네이션은 일관된 결과를 보장하기에 성능이 좋으며, 오프셋 기반 페이지네이션은 구현이 간단하고 작은 데이터셋에서는 유용하다.
개발 1년차 시절에는 오프셋 기반의 페이지네이션을 주로 구현했지만, 3년차가 넘어간 시점부터는 커서 기반의 페이지네이션을 주로 이용한다. 이러한 이유는 INDEX 가 잘 반영되었더라도 WHERE 절과 데이터량이 많아질수록 커서에 비해 오프셋이 성능이 덜 나오기 때문이다.
'Algorithm > 알고리즘 응용' 카테고리의 다른 글
Concurrency(동시성) vs Parallelism(병렬성) (0) | 2024.03.15 |
---|---|
Rate Limit 을 처리하는 이유 (브루트 포스/SMS 공격 등) (0) | 2024.02.09 |