게시글 목록 페이징 처리를 위한 글로 게시글 작성, 수정, 삭제 등은 제외한
게시글 목록보기만 정리하였습니다.
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() 함수로 구하여 게시글 목록을 표현해준다.
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개로 변경
'Spring' 카테고리의 다른 글
SpringBoot 스프링부트 프로젝트 설정방법 (0) | 2022.05.23 |
---|---|
스프링(Spring ) Security 비밀번호 암호화 (0) | 2022.05.04 |
스프링(Spring) 비동기 Ajax 아이디 중복확인 및 로그인 예제와 @RequestParam , @RequestBody, @ModelAttribute 차이점 (0) | 2022.05.01 |
Spring CRUD 예제 (0) | 2022.04.19 |
Spring 기본 환경 설정 방법 (0) | 2022.04.12 |