관리 메뉴

LIFE & IT

[ 페이징처리 3 ] Mybatis 와 스프링에서 페이징 처리 본문

웹 프로그래밍/Spring Framework

[ 페이징처리 3 ] Mybatis 와 스프링에서 페이징 처리

프린이! 2020. 2. 26. 23:18

객체 생성을 통한 페이징 처리

 

 

Criteria = "검새의 기준"

 

용도 : pageNum , amount 값을 같이 전달하는 용도

 

 

게시글 페이지는 "1" 페이지 그리고 1페이지당 10개의 게시글을 보여준다고 가정

package org.zerock.domain;

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

@Getter
@Setter
@ToString
public class Criteria {

	private int pageNum;
    private int amount;
    
    public Criteria(){
    this(1,10) // 1 페이지, 10개 게시글
    }
    
    public Criteria(int pageNum, int amount) {
    	this.pageNum = pageNum;
        this.amount = amount;
        }
 }

 

BoardMapper 인터페이스에 Criteria 타입을 파라미터로 사용하는 getListWithPaging() 메서드를 작성

package org.zerock.mapper;

import java.util.List;

import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;

public interface BoardMapper {

	public List<BoardVO> getListWithPaging(Criteria cri);
    
}

 

/ex02/src/main/resources/org/zerock/mapper/

BoardMapper.xml 에 getListWithPaging SQL 태그 추가

<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
	<![CDATA[
    select
    	bno, title, content, writer, regdate, updatedate
    from
       	(
        select /*+INDEX_DESC(tbl_board pk_board) */
        	rownum rn, bno, title, content, writer, regdate, updatedate
        from
        	tbl_board
        where rownum <= 20
        )
     where rn > 10
     ]]>
   </select>

- CDATA  처리는 XML 에서는 처리할 수 없는 부등호를 사용하기 위함이다. XML 에서는 '<' , '>' 기호는 태그로 인식.

(&lt; , &gt 같은 특수 문자 사용 할 수는 있다. )

- 인라인뷰에선 BoardVO를 구성하는데 필요한 모든 컬럼, Rownum을 rn 가명을 이용해 만든다

- 아웃라인 에서는 rn 컬럼을 조건을 처리

 

위의 XML 10, 20 은  각각 amount, pageNum 값이기 때문에 아래와 같이 변경 할 수 있다.

<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
  	<![CDATA[
  	select
  	 bno, title, content, writer, regdate, updatedate
  	from
  	   (
  	   select /*+INDEX_DESC(tbl_board pk_board) */
  	     rownum rn, bno, title, content, writer, regdate, updatedate
  	   from
  	    tbl_board
  	   where rownum <= #{pageNum}*#{amount}
  	   )
  	   where rn > (#{pageNum} -1)*#{amount}
  	]]>
  </select>

- rownum <= pageNum * amount

   1 페이지일 경우 rownum 을 10개 까지만 찾아야 하고 2 페이지일 경우 rownum 을 20개까지 찾아야하기 때문에 [[ 페이지 * 게시글 표시량 ]] 으로 계산한다.

 

- rn > (pageNum -1) * amount

  1 페이지일 경우 rownum 을 인라인뷰에서 1~10까지만 찾아야하고 2 페이지일 경우 rownum 을 인라인뷰에서 11~20까지만 찾아내야하기 때문에 [[ (페이지-1) * 게시글 표시량 ]] 으로 계산한다.

 

 

 

 

* 출처: 코드로 배우는 스프링 웹프로젝트 <남가람 북스>