본문 바로가기

프로젝트

[서점 프로젝트] Offset 페이지네이션

서비스가 커질수록 도서 데이터는 엄청 증가할 것입니다.
도서 전체를 요청하면 대량의 데이터를 보내느라 서비스가 느려지는 것도 불가피해집니다.

데이터의 용량을 나누기 위해서 페이지네이션을 구현하고자 하였습니다.
페이지네이션에는 OffsetCursor 두 방법이 있습니다.
이번에는 원하는 페이지를 바로 볼 수 있고 정렬에 유리한 Offset을 선택했습니다.


📃 LIMIT, OFFSET

기본적으로 테이블에서 제한된 양의 데이터를 출력하고 싶다면 LIMIT을 사용합니다.

SELECT * FROM 테이블명 LIMIT 5; -- 가장 첫 데이터부터 5개를 출력

 

데이터가 시작하는 위치를 정하고 싶다면 OFFSET을 사용합니다.

SELECT * FROM 테이블명 LIMIT 5 OFFSET 0; -- 0(처음)부터 데이터 5개 출력
SELECT * FROM 테이블명 LIMIT 10 OFFSET 5; -- 5부터 데이터 10개 출력

 

이제 예시를 통해 응용해보겠습니다.
클라이언트가 1번 카테고리(소설)에 속한 도서를 조회합니다.
쿼리를 통해서 몇 페이지인지, 페이지 당 몇 권인지, 최신순 정렬을 원하는지 알 수 있습니다.

# POST
{{host}}/categories/1/books?page=1&limit=20&sort=newest

사용자의 관점과 DB의 관점에서 처음은 다르기 때문에 OFFSET을 1 빼주면 원하는 데이터를 얻을 수 있습니다.

SELECT *
FROM book
WHERE category_id = 1
ORDER BY published_at DESC
LIMIT 20 OFFSET 0

이 글을 끝까지 봐주셔서 감사합니다!
틀린 내용이 있다면 댓글로 지적 부탁드립니다.