[스프링][문제해결] MySQL LIMIT 이용 페이징 처리시 페이지 번호 클릭 이동이 안되는 문제
구멍가게 코딩단의 책 "코드로 배우는 스프링 웹 프로젝트(개정판)"으로 Spring legacy project 실습을 하고 있다. 책에서는 Oracle DB를 베이스로 하고 있는데 나의 경우에는 MySQL로 실습 중이다. 309~313쪽을 실습 중이었고 [그림 1]의 페이지 번호를 클릭하면 페이지 이동이 되어야 하는데 제대로 작동하지 않아 애를 먹었다.
아래 코드는 BoardMapper.xml의 일부로서 페이지 번호 클릭 시 페이지 이동을 담당하는 쿼리이다. MySQL에서는 페이징 처리를 위해 Oracle DB와 달리 LIMIT #{pageNum}, #{amount}를 이용한다. #{pageNum}는 몇 개를 skip 하는지이고, #{amount}는 몇 개의 데이터를 가져오는지이다. 예를 들어 1~10을 가져오고 싶다면 "LIMIT 0, 10"이라고 하면 된다.
<select id="getListWithPaging" resultType="com.dand.domain.BoardVO">
<![CDATA[
select * from (
select bno, title, writer, regdate, updatedate
from tbl_board order by bno asc, regdate desc) as T1
limit #{skip}, #{amount}
]]>
</select>
페이지 번호를 클릭하면 위 쿼리 LIMIT 부분에 skip, amount에 해당 값이 넘어와야 한다. amount는 10으로 정해 두었기 때문에 문제가 없었으나 skip이 문제였다. (pageNum-1) * amount로 계산된 값이 넘어와야 하는데 [그림 2]와 같이 0만 넘어왔기 때문이다.
이 문제는 Criteria.java 파일에서 Lombok이 자동으로 만들어 주는 @Setter 어노테이션을 사용하지 않고 수동으로 코딩하여 해결하였다. setPageNum에 skip 값 계산식 (pageNum-1) * amount을 직접 작성하니 [그림 3]과 같이 계산된 값이 정상적으로 넘어왔다.
Criteria.java 파일의 전체 코드는 다음과 같다.
package com.dand.domain;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public class Criteria {
private int pageNum;
private int amount;
private int skip;
public Criteria() {
this(1, 10);
this.skip = 0;
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
this.skip = (pageNum-1) * amount; // 이 계산식이 있어야 skip 값이 계산되어 페이지 번호 버튼이 작동한다.
}
public void setPageNum(int pageNum) {
this.skip = (pageNum-1) * amount; // 이 계산식이 있어야 skip 값이 계산되어 페이지 번호 버튼이 작동한다.
this.pageNum = pageNum;
}
public void setAmount(int amount) {
// this.skip = (pageNum-1) * amount;
this.amount = amount;
}
public void setSkip(int skip) {
this.skip = skip;
}
}
아래 링크는 이 문제 해결을 위해 참조한 자료이다.
https://kimvampa.tistory.com/172?category=843151
[스프링 게시판][6] 페이징 기능 구현(페이징 쿼리 적용)
Git 주소 : github.com/sjinjin7/Blog_BoardProject 목표 페이징 쿼리 적용 저번 포스팅([스프링 게시판][6] 페이징 기능 구현(페이징 쿼리 정리))에서 정리한 쿼리를 활용하여 현재의 목록 페이지(list.jsp)에 각
kimvampa.tistory.com