본문 바로가기

Spring

스프링 페이징 처리

게시글 목록 페이징 처리를 위한 글로 게시글 작성, 수정, 삭제 등은 제외한

게시글 목록보기만 정리하였습니다.

 

 

PageDTO.java

package com.icia.mbo.dto;

public class PageDTO {

	private int page;
	private int maxPage;
	private int startPage;
	private int endPage;
	private int startRow;
	private int endRow;
	private int limit;
	
	
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
	public int getMaxPage() {
		return maxPage;
	}
	public void setMaxPage(int maxPage) {
		this.maxPage = maxPage;
	}
	public int getStartPage() {
		return startPage;
	}
	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}
	public int getEndPage() {
		return endPage;
	}
	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}
	public int getStartRow() {
		return startRow;
	}
	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}
	public int getEndRow() {
		return endRow;
	}
	public void setEndRow(int endRow) {
		this.endRow = endRow;
	}
	public int getLimit() {
		return limit;
	}
	public void setLimit(int limit) {
		this.limit = limit;
	}
	
	@Override
	public String toString() {
		return "PageDTO [page=" + page + ", maxPage=" + maxPage + ", startPage=" + startPage + ", endPage=" + endPage
				+ ", startRow=" + startRow + ", endRow=" + endRow + ", limit=" + limit + "]";
	}
	
	
}

 

 

boardController.java 

package com.icia.board.controller;

import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.icia.board.dto.BoardDTO;
import com.icia.board.service.BoardService;

@Controller
public class BoardController {

	
	private ModelAndView mav = new ModelAndView();
	
	@Autowired
	private BoardService bsvc;
	
	// pagingList : 페이징처리 메소드
	// @@RequestParam(value = , )
	@RequestMapping(value = "/pagingList", method = RequestMethod.GET)
	public ModelAndView pagingList(@RequestParam(value = "page",required = false, defaultValue = "1") int page, @RequestParam(value = "limit",required = false, defaultValue = "5") int limit){
		// value : jsp 혹은 다른 메소드에서 넘겨주는 매개변수 이름
		// required : false일때 page값을 받아오지 않아도 상관없다. true일때 무조건 page값을 받아와야 한다.
		// defaultValue="1" : required가 false일때 page값을 1로 설정한다.
		
		//오류 방지용 코드 페이지값이 혹시라도 0이하일때 페이지값을 1로 설정
		if(page <= 0) {
			page = 1;
		}
		System.out.println("[1] 게시글목록 Controller : ");
		mav = bsvc.pagingList(page, limit);
		
		System.out.println("[5] 게시글목록 Service : ");
		return mav;

	}
	
	
}

 

 

boardService.java (페이징 처리에 필요한 핵심 알고리즘2)

package com.icia.board.service;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.icia.board.dao.BoardDAO;
import com.icia.board.dto.BoardDTO;
import com.icia.board.dto.PageDTO;

@Service
public class BoardService {

	@Autowired
	private BoardDAO dao;
	
	private ModelAndView mav = new ModelAndView();
	
	// 한 화면에 보여줄 페이지 번호 갯수
	private static final int BLOCK = 5;
	
	
	public ModelAndView pagingList(int page, int limit) {
	
		// 페이지 객체 생성
		PageDTO paging = new PageDTO();
		
		// 전체 개시글 갯수
		int listCount = dao.bCount();
        
		// 한 페이지의 표시될 시작글 
		int startRow = (page-1) * limit + 1;
        
        	// 한 페이지의 표시될 마지막글 
		int endRow = page * limit;
		
		// limit 한페이지에 보여줄 게시글 갯수 : 5
		// page : 1 / startRow = 1 / endRow = 5
		// page : 2 / startRow = 6 / endRow = 10
		
        	// 총 페이지 번호 구하기 (총 게시글 갯수 * 한 화면에 표현할 게시글 갯수를 무조건 올림 후 int로 형변환)
		int maxPage = (int)(Math.ceil((double)listCount/limit)); 
        	// 한 페이지의 표시될 시작글 
		int startPage = ((int)(Math.ceil((double)page/BLOCK))-1) * BLOCK+1;
        	// 한 페이지의 표시될 마지막글 
		int endPage = startPage+BLOCK-1;
		
		// page : 1 / startPage = 1 / endPage = 5
		// page : 5 / startPage = 1 / endPage = 5
		// page : 6 / startPage = 6 / endPage = 10
		
		
		// 오류방지
		if(endPage > maxPage) {
			endPage = maxPage;
		}
		
		paging.setPage(page);
		paging.setStartRow(startRow);
		paging.setEndRow(endRow);
		paging.setMaxPage(maxPage);
		paging.setStartPage(startPage);
		paging.setEndPage(endPage);		
		paging.setLimit(limit);
		
		List<BoardDTO> plist = dao.pagingList(paging);
		
		mav.addObject("plist",plist);
		mav.addObject("paging",paging);
		
		mav.setViewName("pagingList");
		
		
		return mav;
	}

 

여기서 집고 넘어가야 할 점은 

startRow와 endRow인데 현재 페이지에서 화면에 표시될 게시글(번호)를 의미하며 

진짜 게시판에 작성된 게시글번호가 아닌 DB 테이블 상에 붙는 고유 번호를 의미한다.

그 번호를  DB에서  ROW_NUMBER() 함수로 구하여 게시글 목록을 표현해준다.

 

 

RN으로 고유번호 구하기

 

 

boardDAO.java

package com.icia.board.dao;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.icia.board.dto.BoardDTO;
import com.icia.board.dto.PageDTO;

@Repository
public class BoardDAO {

	@Autowired
	private SqlSessionTemplate sql;
	
	// 게시글 갯수 구하는 메소드
	public int bCount() {
		// TODO Auto-generated method stub
		return sql.selectOne("Board.count");
	}

	public List<BoardDTO> pagingList(PageDTO paging) {
		// TODO Auto-generated method stub
		System.out.println("[3] 페이징 dao : "+paging);
		return sql.selectList("Board.pList",paging);
	}



}

 

 

boardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 이 아래에 있는 기본양식이 있어야 mapper로 인식한다.-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Board">

	<select id="count" resultType="int">
		SELECT COUNT(*) FROM BOARDDTO
	</select>
	
	<select id="pList" parameterType="paging" resultType="board">
		SELECT * FROM BOARDLIST WHERE RN BETWEEN #{startRow} AND #{endRow}
	</select>
</mapper>

 

parameterType과 resultType 부분 설정은 

src/main/resources/mybatis-config.xml 파일로 설정이 가능합니다.

 

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
	<typeAlias type="com.icia.board.dto.BoardDTO" alias="board"/>
	<!-- com.icia.member.dto.MemberDTO 대신 alias 별칭으로 member로 사용한다고 변경 -->
	
	<typeAlias type="com.icia.board.dto.PageDTO" alias="paging"/>
</typeAliases>

</configuration>

 

 

 

pagingList.jsp (페이징 처리에 필요한 핵심 알고리즘2)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>페이징 처리 페이지</title>
</head>
<style>
tr,td,th{

      text-align: center;
      border-collapse: collapse;
      padding: 20px;
	
}
</style>
<body>
	<form action="pagingList" method="get">
		<p>한 페이지에 출력할 게시글 갯수</p>
		<%-- <input type="hidden" name="page" value="${paging.page}"> --%>
		<c:if test="${paging.limit==3}">
			<select name="limit">
				<option value="3"selected="3">3</option>
				<option value="5">5</option>
				<option value="10">10</option>
			</select>
		</c:if>
		<c:if test="${paging.limit==5}">
			<select name="limit">
				<option value="3">3</option>
				<option value="5" selected="5">5</option>
				<option value="10">10</option>
			</select>
		</c:if>
		<c:if test="${paging.limit==10}">
			<select name="limit">
				<option value="3">3</option>
				<option value="5">5</option>
				<option value="10" selected="10">10</option>
			</select>
		</c:if>
		<input type="submit" value="선택"/>
	</form>

	<table>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회수</th>
		</tr>
		<c:forEach var="pl" items="${plist}">
			<tr>
				<td>${pl.bNum}</td>
				<td><a href="boardView?bNum=${pl.bNum}">${pl.bTitle}</a></td>
				<td>${pl.bWriter}</td>
				<td>${pl.bDate}</td>
				<td>${pl.bHit}</td>
			</tr>
		</c:forEach>
	</table>
	
	<!-- 페이징 처리 -->
	<!-- [이전]페이지로 페이징 처리 -->
	<c:if test="${paging.page <=1}">[이전]</c:if>
	<c:if test="${paging.page > 1}"><a href="pagingList?page=${paging.page-1}&limit=${paging.limit}">[이전] </a></c:if>
	<!-- [페이지번호]에 대한 페이징 처리 -->
	
	<!-- 현재페이지 일때 --> 
	<!-- 현재페이지가 아닐때 -->
	<!-- eq는 이퀄로 ==와 같음  !=는 ne -->
	
	<c:forEach var="i" begin="${paging.startPage}" end="${paging.endPage}" step="1">
		<c:choose>
		
			<c:when test="${paging.page eq i}"> [${i}]</c:when>
			
			
			<c:otherwise>
				<a href="pagingList?page=${i}">${i}</a>
			</c:otherwise>
		</c:choose>
	</c:forEach>
	<!-- [다음]페이지로 페이징 처리 -->
	<c:if test="${paging.page >= paging.maxPage}">[다음]</c:if>
	<c:if test="${paging.page < paging.maxPage}">
	<a href="pagingList?page=${paging.page+1}&limit=${paging.limit}"> [다음]</a>
	</c:if>
</body>
</html>

 

 

 

DB 테이블은 https://cygnus.tistory.com/69?category=1043694 글을 참조합니다.

 

 

 

 

 

페이징 처리 결과 - 1페이지

 

 

페이징 처리 결과 - 2페이지

 

 

 

페이징 처리 결과 - 게시글 보기 10개로 변경