페이징 처리의 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번게시글까지 나오면 되는데
성공적으로 잘 나온 것을 볼 수 있다!
'Spring boot' 카테고리의 다른 글
Springboot [페이징 처리] (JPA) (0) | 2022.09.14 |
---|---|
Springboot [페이징 처리] (rownum 쿼리 이용) [2] (0) | 2022.09.13 |
Springboot [페이징 처리] (limit 쿼리를 이용) (0) | 2022.09.13 |
Springboot [썸네일업로드 기능 추가] (0) | 2022.08.01 |
Springboot 파일업로드 로직 추가 및 vue 구현 (0) | 2022.07.22 |