- [스프링][문제해결] MySQL LIMIT 이용 페이징 처리시 페이지 번호 클릭 이동이 안되는 문제2022년 06월 24일 01시 37분 31초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
구멍가게 코딩단의 책 "코드로 배우는 스프링 웹 프로젝트(개정판)"으로 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
728x90반응형'언어·프레임워크 > Spring' 카테고리의 다른 글
[Spring][문제해결] Spring의 web.xml 한글 깨짐 해결 (0) 2022.08.29 [스프링] MySQL 페이징 처리 쿼리 (0) 2022.06.23 [스프링] Oracle의 nextval 함수를 MySQL에서 처리하는 방법 (0) 2022.06.20 [스프링][문제해결] MariaDB와 log4jdbc 관련 에러 (0) 2022.06.19 [스프링][문제해결] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): (0) 2022.06.15 다음글이 없습니다.이전글이 없습니다.댓글