커서 기반 페이징 구현


Cursor 기반 페이징 구현

타임라인 기능을 위해 무한 스크롤을 이용한 페이징 방식을 구현해보기로 했다.
스프링을 공부하면서 pagination을 공부하면서 Offset 기반의 페이징만 구현했는데,
SNS 같은 무한 스크롤에서 문제가 생길 수 있다고 한다.

1. Offset

SELECT * FROM POSTS ORDER BY ID DESC LIMIT 0, 10  
SELECT * FROM POSTS ORDER BY ID DESC LIMIT 10, 10  
SELECT * FROM POSTS ORDER BY ID DESC LIMIT 20, 10  

실시간으로 많은 글이 올라오는 환경에서 위 쿼리는 다음고 같은 문제를 발생시킨다.
첫번째 쿼리가 실행되고 그 사이에 게시글 하나가 추가되면 두번째 쿼리를 조회할 때 중복될 수 있다.

2. Cursor

커서 기반 페이징은 조회할 때 내가 읽은 마지막 요소를 알려줘서 그 뒤의 값을 조회할 수 있도록 하는 것이다.

SELECT * FROM Post p WHERE p.user_id = :userId ORDER BY p.id DESC LIMIT 10
SELECT * FROM Post p WHERE p.user_id = :userId AND p.id < :id ORDER BY p.id DESC LIMIT 10    

위 쿼리는 litebook 프로젝트에서 사용한 쿼리이다.
최신 10개의 게시글을 조회하고 이전에 조회한 마지막 id 보다 작은 10개를 가져오라는 것이다.


REST API

litebook은 타임라인 기능을 중심으로 프론트까지 같이 개발했었는데
서버 위주로 개발하고 싶은 욕심이 생겨서 rest api로 댓글, 좋아요, 검색, 친구 추천 기능 등등
기능을 더 추가해서 설계부터 다시 개발하기로 결심했다!