Spring / / 2024. 7. 14. 23:31

Pagination

페이징은 수 많은 콘텐츠(데이터)들을 원하는 크기만큼 '페이지'로 나누는 기술을 의미합니다.

주로 데이터베이스 쿼리나 API 응답에서 사용되며, 크기를 줄인 만큼 DB 에 부담을 줄이고 성능을 향상 시킵니다.

이러한 페이징 기술을 크게 2가지 기술을 사용합니다.

오프셋 기반 페이징(Offset Paging)

첫 번째는 오프셋 기반 페이징 입니다.

오프셋 기반 페이지네이션은 MySQL 기준으로 offset, limit을 사용하여 쿼리르 작성합니다.

하지만 이는 성능 저하 문제가 발생할 수 있습니다. offset의 크기가 커질수록 조회해야 하는 데이터 수가 늘어나기 때문입니다.

select * from item
order by created_at desc
limit 10
offset 10000000;

이와 같은 경우 100,000,000 개 만큼의 데이터를 가져와 모두 읽은 다음 limit 을 걸어둔 10개의 데이터를 가져오기 때문에 조회 성능에서 상당히 좋지 않습니다

또한 오프셋 기반 페이지네이션은 중복 문제가 발생할 수 있습니다.

페이지 단위가 커질 때 DB 컬럼을 조회하는 동안 새로운 값이 추가되었다면, 해당 페이지에 이전 중복된 데이터를 가져올 수 있는 문제가 존재합니다.

커서 기반 페이징(Cursor Paging)

두 번째는 커서 기반 페이지네이션입니다.

이는 Cursor 개념을 사용하여 사용자에게 응답해준 마지막 데이터의 식별자 값을 Cursor로 사용합니다.

select * from item
order by id asc
limit 10;

select * from item
where id > 10 
order by id asc
limit 10;

첫 번째 페이지에서 요청한 값들의 id 값은 1~10 입니다.

마지막으로 조회된 id 값인 10이 cursor로 지정되고 이는 다음 페이지 요청 시 사용됩니다.

오프셋 기반 페이지네이션은 읽어야 하는 데이터의 갯수를 늘려놓고 자르는 방식을 사용하는데, 커서 기반 페이지네이션은 cursor 저장을 통해 많은 양의 데이터를 미리 읽어올 필요가 없습니다.

 

두 페이지네이션 방법을 성능으로 나타낸 표를 보며 이만 포스팅을 마치겠습니다.

'Spring' 카테고리의 다른 글

@Valid 검증 어노테이션  (0) 2024.07.21
Bean Lifecycle  (0) 2024.07.07
Transaction Propagation  (2) 2024.06.30
ThreadLocal  (2) 2024.06.09
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유