Spring 게시판 만들기 기초-2 페이징

2022. 2. 13. 21:12Spring/Spring 미니 프로젝트

페이징을 적용해봅시다. 검색따윈 안합니다. 페이징은 List만 신경쓰면 됩니다.

 

페이징을 위해선 PagingVO가 필요합니다.

com.study.common.vo 패키지에 PagingVO를 만들어줍시다.

PagingVO

package com.study.common.vo;

import java.io.Serializable;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class PagingVO implements Serializable {

	//입력받는 데이터
	private int curPage=1;           // 현재 페이지 번호
	private int rowSizePerPage=10;   // 한 페이지당 레코드 수      기본10
	private int pageSize=10;         // 페이지 리스트에서 보여줄 페이지 갯수  이거는 보통 10 or 5 안 변함 
	private int totalRowCount ;      // 총 레코드 건수
	
	
	//입력받는 데이터를 통해 계산되는 값
	private int firstRow ;           // 시작 레크드 번호   
	private int lastRow;             // 마지막 레크드 번호 
	private int totalPageCount;      // 총 페이지 건수
	private int firstPage; 	         // 페이지 리스트에서 시작  페이지 번호 
	private int lastPage;            // 페이지 리스트에서 마지막 페이지 번호 
	

	public void pageSetting() {
		totalPageCount = (totalRowCount-1)/rowSizePerPage+ 1;
		firstRow = (curPage - 1) * rowSizePerPage + 1;
		lastRow = firstRow + rowSizePerPage-1;
		if(lastRow >= totalRowCount) { 
			lastRow = totalRowCount;
		} 

		firstPage = (  (curPage-1) / pageSize) * pageSize + 1;
		
		lastPage = firstPage + pageSize-1;
		if(lastPage > totalPageCount) {
			lastPage = totalPageCount;
		}
	
		
		
		
		
		
	}
	 @Override 
	  public String toString() {
		  return ToStringBuilder.reflectionToString(this,
				  ToStringStyle.MULTI_LINE_STYLE); 
		}
	
	
	
	
	public int getCurPage() {
		return curPage;
	}


	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}


	public int getRowSizePerPage() {
		return rowSizePerPage;
	}


	public void setRowSizePerPage(int rowSizePerPage) {
		this.rowSizePerPage = rowSizePerPage;
	}


	public int getFirstRow() {
		return firstRow;
	}


	public void setFirstRow(int firstRow) {
		this.firstRow = firstRow;
	}


	public int getLastRow() {
		return lastRow;
	}


	public void setLastRow(int lastRow) {
		this.lastRow = lastRow;
	}


	public int getTotalRowCount() {
		return totalRowCount;
	}


	public void setTotalRowCount(int totalRowCount) {
		this.totalRowCount = totalRowCount;
	}


	public int getTotalPageCount() {
		return totalPageCount;
	}


	public void setTotalPageCount(int totalPageCount) {
		this.totalPageCount = totalPageCount;
	}


	public int getPageSize() {
		return pageSize;
	}


	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}


	public int getFirstPage() {
		return firstPage;
	}


	public void setFirstPage(int firstPage) {
		this.firstPage = firstPage;
	}


	public int getLastPage() {
		return lastPage;
	}


	public void setLastPage(int lastPage) {
		this.lastPage = lastPage;
	}



}

 

/free/freeList.wow로 요청 할  때 PagingVO를 매개변수로 받습니다.

그리고  DB에서 PagingVO를 통해 데이터를 제한적으로 가져와야합니다.

이를 위해 IFreeBoardDao에 getTotalRowCount(PagingVO paging)를 추가합니다. 

또 IFreeBoardDao의 getBoardList()메소드도  getBoardList(PagingVO paging)으로 바꿉니다.

바뀐 IFreeBoardDao.java

	public int getTotalRowCount(PagingVO paging);
	public List<FreeBoardVO> getBoardList(PagingVO paging);

 

이제 freeBoard.xml에서 getTotalRowCount를 작성하고

getBoardList를 약간 수정해 줍시다.

freeBoard.xml

	<select id="getTotalRowCount" parameterType="com.study.common.vo.PagingVO" resultType="int">
	SELECT count(*)
	FROM free_board
	</select>

	<select id="getBoardList" resultType="com.study.free.vo.FreeBoardVO" parameterType="com.study.common.vo.PagingVO">
		SELECT * FROM 
		(SELECT a.*,rownum AS rnum FROM (
		SELECT bo_no
		     , bo_title , bo_category, bo_writer
		     , bo_pass, bo_content,  bo_hit
		     , to_char(bo_reg_date,'YYYY-MM-DD') AS bo_reg_date
		     , to_char(bo_mod_date,'YYYY-MM-DD') AS bo_mod_date
		     , bo_del_yn
		FROM free_board
		WHERE bo_del_yn='N'
		ORDER BY bo_no desc
		) a  )b
		WHERE rnum between #{firstRow} and #{lastRow}
		
	</select>

 

 

Controller단에서 PagingVO의  나머지 필드들도 세팅한 후 model 담아 jsp에 전달합니다.

FreeController의 바뀐 freeList메소드는 다음과 같습니다.

FreeController.java

	@RequestMapping("/free/freeList.wow")
	public String freeList(Model model, @ModelAttribute("paging")PagingVO paging) {
		int totalRowCount=freeBoardDao.getTotalRowCount(paging);
		paging.setTotalRowCount(totalRowCount);
		paging.pageSetting();
		List<FreeBoardVO> freeBoardList=freeBoardDao.getBoardList(paging);
		model.addAttribute("freeBoardList",freeBoardList);
		return "free/freeList";
	}

 

이 상태에서 /free/freeList.wow를 요청해보면 화면은 다음과 같다. 

이는 기본적으로 curPage가 1인 화면이다. 이제 여기에서 curPage에 변화를 주는 a태그를 만들면 된다.

freeList.jsp 하단부에 다음의 태그를 추가하자.

freeList.jsp

<a href="freeList.wow?curPage=1">&laquo;</a>
<a href="freeList.wow?curPage=${paging.curPage-1 }">&lt;</a>
<c:forEach begin="${paging.firstPage }"  end="${paging.lastPage }" var="i">
   	<a href="freeList.wow?curPage=${i }"  >  
   		<c:if test="${i eq paging.curPage }">  <span style="color: red">  ${i } </span> </c:if>
   		<c:if test="${i ne paging.curPage }">  ${i } </c:if> 
   	</a>
</c:forEach>
<a href="freeList.wow?curPage=${paging.curPage+1 }">&gt;</a>
<a href="freeList.wow?curPage=${paging.totalPageCount }">&raquo;</a>

 

이후 다시 /free/freeList.wow를 요청하면 다음과 같은 화면이 나온다.

 

※간단한 버전에서    > 는 1페이지씩 다음페이지로 이동하도록 구현하였다.