Dandy Now!
  • [스프링][문제해결] MySQL LIMIT 이용 페이징 처리시 페이지 번호 클릭 이동이 안되는 문제
    2022년 06월 24일 01시 37분 31초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    구멍가게 코딩단의 책 "코드로 배우는 스프링 웹 프로젝트(개정판)"으로 Spring legacy project 실습을 하고 있다. 책에서는 Oracle DB를 베이스로 하고 있는데 나의 경우에는 MySQL로 실습 중이다. 309~313쪽을 실습 중이었고 [그림 1]의 페이지 번호를 클릭하면 페이지 이동이 되어야 하는데 제대로 작동하지 않아 애를 먹었다.

    [그림 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만 넘어왔기 때문이다.

    [그림 2] pageNum 값의 변화에 따라 skip 값이 변해야하는데 0만 넘어오고 있다.

     

    이 문제는 Criteria.java 파일에서 Lombok이 자동으로 만들어 주는 @Setter 어노테이션을 사용하지 않고 수동으로 코딩하여 해결하였다. setPageNum에 skip 값 계산식 (pageNum-1) * amount을 직접 작성하니 [그림 3]과 같이 계산된 값이 정상적으로 넘어왔다.

    [그림 3] skip에 계산된 값이 정상적으로 넘어왔다.

     

    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

     

    728x90
    반응형
    댓글