본문 바로가기
Spring boot

Springboot [페이징 처리] (rownum 쿼리 이용) [1]

by z00h 2022. 9. 13.

 

페이징 처리의 2번째 방법으로는 rownum쿼리를 이용하는 방법이 있다.

 

1번째의 limit쿼리의 장점은 쿼리 자체가 1줄로 간결하다는 장점이 있지만 여러가지 필요한 정보를 더 담아오는데 제한적이다. limit을 사용하였을때에는 size, pageNum 두 변수만을 사용하여 frontend에서 받아 왔지만 rownum을 이용하면 

 

① 현재 페이지 번호 (page)

② 이전과 다음으로 이동 가능한 링크의 표시 여부 (prev, next)

③ 화면에서 보여지는 페이지의 시작 번호와 끝 번호 (startPage, endPage)

 

를 구하여 더 다양하게 다룰수 있게 된다.

 

 

rownum은 rownum이라는 가상의 컬럼을 만들고 원하는 rownum을 추출하도록 해준다.

 

우선 mariadb(mysql)로 rownum을 만드는 방법은

 

 

보통 FROM절에서 rownum을 초기화 한다.

 

select @rownum:= @rownum +1, 테이블명.* from (select @rownum := 0)as rn, 테이블명;

 

 

 

select *
from (
	select @rownum:=@rownum+1 as rn, car.*
	from(select @rownum :=0)as rn, car
) CarList

where rn > 0 and rn <= 10	-- 페이징 번호 1인 경우(1~10)
where rn > 10 and rn <= 20;	-- 페이징 번호 2인 경우(11~20)
where rn > 20 and rn <= 30;	-- 페이징 번호 3인 경우(21~30)

 

 

FROM절에서 초기화 후 where 절에서 약칭인 rn으로 그에 해당하는 데이터를 추출해주는 모습이다.

 

 

 

 

1번 방법과 똑같이 Criteria 클래스를 생성해준다.

 

/* Criteria.java */

package org.yjin.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {
	
	private int pageNum;
	private int amount; //size와 동일
	
	public Criteria() {
		this(1, 10);
		// 기본값을 1페이지, 10개로 지정
	}
	
	public Criteria(int pageNum, int amount) {
		this.pageNum = pageNum;
		this.amount = amount;
	}
}

 

 

 

변수는 pageNum, amount(size) 를 선언하고

생성자를 만들어준다.

 

 

 

 

 

DAO에서 Criteria를 파라미터로 사용하는 메서드(getPageCarList)를 추가해주고 Mapper를 작성한다.

 

 

 

 

CarMapper.java

 

<select id="getPageCarList"
	resultType="org.yjin.domain.BoardVO">
	<![CDATA[
		select 
		from (
			select @rownum:=@rownum+1 as rn, car.*
			from(select @rownum :=0)as rn, car
		) carlist
		where rn > (#{pageNum} -1)* #{amount} and rn <= #{pageNum} * #{amount};
	]]>
</select>

 

 

 

 

 

 

 

 

 

 

Controler에서는 get방식을 사용하여 api를 호출하였다.

 

 

CarController.java

 @GetMapping(value = "/pageList")
    public List<CarDTO> getPageCarList(Criteria criteria) {
            return carService.getPageCarList(criteria);
    }

 

 

 

 

 

 

 

 

CarService.java

 

   public List<CarDTO> getPageCarList(Criteria criteria) {
        return carDAO.getPageCarList(criteria);
    }

 

 

 

 

 

 

 

 

 

 

 

 

이제 PostMan으로 Api를 호출해 보면 (pageNum=2, amount=5)

 

 

 

 

 

pageNum은 2, amount는 5로 Param을 넣어 6번게시글부터 10번게시글까지 나오면 되는데

성공적으로 잘 나온 것을 볼 수 있다!