DeliDeli 프로젝트에서 매장조회 관련해서 구현할 때 만났던 문제이다!
매장 조회를 구현할 때 처음 내 쿼리는 모든 매장데이터를 불러와서 성능적으로 좋지 못했다. (한 두개가 아니라 매우 많은 매장이 등록되어 있을 테니까!)

그래서 페이지 처리에 대해 공부해보고 적용해보았다.

페이징 처리를 하는 이유는?

위에서 말했듯이 데이터 베이스에서 모든 정보를 한번에 가져와서 보여주는 것은 속도가 느리기 때문에 사용자에게 보여지는데 오랜 시간이 걸릴 것이다

그리고 또, 사용자 입장에서 생각해보자면
모두 데이터를 불러와도 사용자가 다 읽지 못하기 때문에 다 불러올 필요가 없다!

그래서 한 페이지에서 보여주는 데이터의 범위를 결정해서 보여주는 방법이다.

1. Offset 방식

데이터 베이스의 offset쿼리를 이용해서 페이지 단위로 구분하여 요청/응답하는 방식이다.
데이터 베이스에서 모든 데이터를 읽어온 후에 순서를 부여해서 offset부터 limit수로 자르는 방법이다.

	private static int perPage = 10;
    
  	public PagingCriteria(int pageNumber) {
        this.pageNumber = pageNumber;
        this.startPage = (pageNumber - 1) * perPage;
SELECT * FROM 테이블명 ORDER LIMIT # {StartPage}, # {perPage}

StartPage+1부터 10개행을 출력한다는 쿼리문입니다.

offset방식의 단점?

  1. 모든 컬럼의 내용을 읽어오기때문에
    인덱스를 활용하는 방법인 Cursor 방법보다 느리다
    ➡️ 데이터 베이스에서 모든 데이터를 읽어서 불러오기 때문에 속도가 느리다
  1. 데이터를 부른 후 다른 사용자가 insert하거나 delete하면
    중복된 데이터를 보는 경우가 생긴다
    ➡️ 예를 들어, 1페이지를 넘기는 순간 다른 데이터가 들어오게되면 2페이지에서 1페이지에서 봤던 데이터들을 보게될 수 있다.

2. Cursor 방식

Cursor 방법은 우리가 보려는 데이터가 어떤 데이터의 다음에 있는 지에 맞춰있기 때문에 중복되는 데이터를 보지 않게 해준다.
보통 SNS나 인스타그램에서 다른 사람들의 피드를 볼 때 이 방법으로 보고있다!


자세한 구현 내용은 제 깃허브에 가시면 확인하실 수 있습니다
delideli 구현코드

이 방법을 이용하면 offset의 단점을 보완해줄 수 있다.

그렇다고 무조건 cursor방식이 좋은 것만은 아니다!

데이터 양이 적고 데이터 추가나 수정등이 적을 때는
offset방식을 이용해도 좋다

하지만 내가 커서방식을 선택한 이유는,
delideli같은 경우에는 매장등록이 매시간마다 이루어질 수 있고,
또 많은 데이터가 있기 때문에 cursor방식을 이용해서 구현했다

profile
백엔드 개발자 (ง •̀ω•́)ง✧

0개의 댓글