[Spring] Paging처리

Whatever·2022년 2월 8일
0

Spring(스프링)

목록 보기
12/29

1. Paging처리를 하기 위해 ArticlePage 클래스를 만든다.

ArticlePage.java

package kr.or.ddit;

import java.util.List;

//페이징 처리를 위한 클래스
//게시글 데이터와 페이징 관련 정보를 담고 있음
public class ArticlePage {
	//페이징 관련 멤버변수
	//전체 글의 행의 수
	private int total;
	//현재 페이지 번호
	private int currentPage;
	//전체 페이지 개수
	private int totalPages;
	//시작 페이지 번호
	private int startPage;
	//종료 페이지 번호
	private int endPage;
	//페이징의 개수
	private int pagingCount;
	//게시글 데이터
	private List<LprodVO> content;
	//생성자
	//size : 한 화면에 보여질 행의 수
	public ArticlePage(int total, int currentPage, int size, int pagingCount,
			List<LprodVO> content) {
		this.total = total;
		this.currentPage = currentPage;
		this.content = content;
		this.pagingCount = pagingCount;
		
		if(total == 0) {//select 결과가 없다면..
			totalPages = 0;
			startPage = 0;
			endPage = 0;
		}else { //select 결과가 있을 때..
			//전체 페이지 개수 구하기(전체 글의 수 / 한 화면에 보여질 행의 수)
			//정수와 정수의 나눗셈의 결과는 정수이므로 13 / 7 => 1
			totalPages = total / size;
			//보정해줘야 할 경우는? 15 / 7 = 2 경우 처럼 나머자가 0보다 클 때 
			if(total % size>0) {
				//전체 페이지수를 1 증가 처리
				totalPages++;
			}
			
			//startPage : 이전 [1] [2] [3] [4] [5] 다음 일 때 1을 의미
			//공식 : startPage = 현재페이지 / 페이징의 개수 * 페이징의 개수 + 1;
			startPage = currentPage / pagingCount * pagingCount + 1;
			//보정해줘야 할 경우는? 5 / 5 * 5 + 1 => 6 경우처럼 
			//				현재페이지 % 5 == 0 일 때
			if(currentPage%pagingCount==0) {
				//startPage = startPage - 5(페이징의 개수);
				startPage -= pagingCount;
			}
			
			//endPage   : 이전 [1] [2] [3] [4] [5] 다음 일 때 5을 의미
			endPage = startPage + (pagingCount-1);
			//보정해줘야 할 경우는? endPage 5 > totalPages 3 일 때
			//				  endPage 5를 totalPages 3로 바꿔줘야 함
			if(endPage > totalPages) {
				endPage = totalPages;
			}
		}//end outer if
	}
	
	//전체 행의 수를 리턴
	public int getTotal() {
		return this.total;
	}
	
	//select결과가 없는가? 체킹 : true면 결과가 없다는 의미
	public boolean hasNoArticles() {
		return this.total == 0;
	}
	
	//select결과가 있는가? 체킹 : true면 결과가 있다는 의미
	public boolean hasArticles() {
		return this.total > 0;
	}
	
	//현재 페이지 번호 리턴
	public int getCurrentPage() {
		return this.currentPage;
	}
	
	//전체 페이지의 개수 리턴
	public int getTotalPages() {
		return totalPages;
	}
	
	//데이터 VO List 리턴
	public List<LprodVO> getContent(){
		return this.content;
	}
	
	//목록 하단의 시작 번호를 리턴
	public int getStartPage() {
		return this.startPage;
	}
	
	//목록 하단의 종료 번호를 리턴
	public int getEndPage() {
		return this.endPage;
	}
}

2. Controller에서 Article객체를 만들어준다.

여기서는 modelAttribute로 "list"를 저장해줬다.(ArticlePage묶음 전체를 list로 저장)

LprodController.java

package kr.or.ddit;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RequestMapping("/lprod")
//모든 요청들이여 나에게 오라
@Controller
public class LprodController {
	//logger 패키지
	private static final Logger logger = 
			LoggerFactory.getLogger(LprodController.class);
	
	@Autowired
	LprodService lprodService;
	//http://localhost:8090/lprod/list?currentPage=1
	//defaultValue : 해당 요청 파라미터를 지정하지 않을 경우(http://localhost:8090/lprod/list)
	//defaultValue 속성에 지정한 문자열을 값으로 이용하게 됨
	@RequestMapping("/list")
	public String list(Model model, @RequestParam(defaultValue="1") int currentPage) {
		logger.info("currentPage : " + currentPage);
		
		List<LprodVO> list = this.lprodService.list();
		logger.info("list.size() : " + list.size());
		//상품분류 별 거래처 목록 행의 수
		int total = this.lprodService.listCount();
		logger.info("total : " + total);
		
		//new ArticlePage(total, currentPage, size, pagingCount, content)
		model.addAttribute("list", 
				new ArticlePage(total, currentPage, 7, 5, list));
		model.addAttribute("total", total);
		
		//forward
		return "lprod/list";
	}
}

3. Mapper에 2개의 쿼리문 필요

1) 검색해서 나온 페이지 전체의 행의 내용
2) 검색해서 나온 페이지 전체의 행의 수

	<!-- 검색해서 나온 전체 행 내용 -->
	<select id="list" parameterType="hashMap" resultType="cusVO">
		SELECT T.RNUM, T.CUS_NUM, T.CUS_NM
		     , T.ADDR, T.PNE
		FROM
		(
		    SELECT ROW_NUMBER() OVER(ORDER BY CUS_NUM, CUS_NM) RNUM
                    , CUS_NUM
                    , CUS_NM
                    , ADDR
                    , PNE
		    FROM CUS  
		    WHERE  1 = 1
		    <if test="keyWord!=null and keyWord!=''">
			    AND    (CUS_NM LIKE '%'||#{keyWord}||'%'
			    OR     ADDR LIKE '%'||#{keyWord}||'%'
			    OR     PNE LIKE '%'||#{keyWord}||'%')
		    </if>
		) T
		WHERE T.RNUM BETWEEN #{currentPage}*#{size}-(#{size}-1) AND #{currentPage}*#{size}
	</select>
	<!-- 검색해서 나온 전체 행의 수 -->
	<select id="listCount" parameterType="hashMap" resultType="int">
		SELECT COUNT(*)
		FROM CUS
		WHERE  1 = 1
	    <if test="keyWord!=null and keyWord!=''">
		    AND    (CUS_NM LIKE '%'||#{keyWord}||'%'
		    OR     ADDR LIKE '%'||#{keyWord}||'%'
		    OR     PNE LIKE '%'||#{keyWord}||'%')
	    </if>
	</select>

4. View단에서 출력

0개의 댓글