
Controller
@GetMapping("/")
public String home(@RequestParam(defaultValue = "1", value = "page")
Integer page, Model model) {
// ๊ฒ์๋ฌผ ๋ชฉ๋ก ์กฐํ(Select) ๋ชจ๋ธ์ ๋ฃ๊ณ
model.addAllAttributes(service.list(page));
//jsp๋ก ํฌ์๋
return "board/home";
}
page=1์ด ๋ณด์ด๊ฒ ํ๊ธฐ ์ํด @RequestParam(defaultValue="1")๋ก ์ค์ ํฉ๋๋ค.addAllAttributes์ Map์ ํฌํจ๋ <ํค, ๊ฐ>์ ํ์ฌ ๋ชจ๋ธ์ ์ถ๊ฐํฉ๋๋ค.Service
public Map<String, Object> list(Integer page) {
int offset = (page - 1) * 10;
int numberOfBoard = mapper.countAll();
int lastPageNumber = (numberOfBoard - 1) / 10 + 1;
int endPageNumber = ((page - 1) / 10 + 1) * 10;
int beginPageNumber = endPageNumber - 9;
endPageNumber = Math.min(endPageNumber, lastPageNumber);
int prevPageNumber = beginPageNumber - 10;
int nextPageNumber = beginPageNumber + 10;
return Map.of("boardList", mapper.selectAllByPage(offset),
"pageInfo", Map.of("lastPageNumber", lastPageNumber,
"endPageNumber", endPageNumber,
"beginPageNumber", beginPageNumber,
"prevPageNumber", prevPageNumber,
"nextPageNumber", nextPageNumber,
"currentPageNumber", page)
);
}
offset : ์ฒซ ๋ฒ์งธ ํ์ด์ง์์๋ 0๋ฒ๋ถํฐ 10๊ฐ, ๋ ๋ฒ์งธ ํ์ด์ง๋ 10๋ฒ๋ถํฐ 10๊ฐ.. ์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํฉ๋๋ค. page๊ฐ 1์ด๋ฉด ํ ํ์ด์ง์ 10๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ณด์ด๋๋ก ํ๊ณ page๊ฐ 2์ด๋ฉด 11๋ฒ๋ถํฐ 20๋ฒ๊น์ง ๋ณด์ด๋๋ก ํฉ๋๋ค.countAll() : ์ ์ฒด ๊ฒ์๊ธ์ ๊ฐฏ์๋ฅผ ์ํ ์ฟผ๋ฆฌnumberOfBoard = ์ ์ฒด ๊ฒ์๊ธlastPageNumber = (์ ์ฒด ๊ฒ์๊ธ -1) / 10 + 1endPageNumber์ beginPageNumber๋ 1~10, 11~20... ์ด๋ ๊ฒ 10๋จ์์ฉ ํ์ด์ง๊ฐ ๋ณด์ฌ์ค์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๊ณต์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
- int endPageNumber =((page - 1) / 10 + 1) * 10
- beginPageNumber = endPageNumber - 9
endPageNumber๋ 10์ฉ ๋์ด์ฃผ๊ธฐ ๋๋ฌธ์ lastPageNumber ๋ณด๋ค ๋ ํฌ๊ธฐ ๋๋ฌธ์ MIN ํจ์๋ฅผ ์ฌ์ฉํด์ lastPageNumber๋ณด๋ค ํฌ์ง ๋ชปํ๋๋ก ์ค์ ํฉ๋๋ค.@Select("""
SELECT * FROM board ORDER BY id DESC LIMIT #{offset}, 10
""")
List<Board> selectAllByPage(int offset);
@Select("SELECT COUNT(*) FROM board")
int countAll();
selectAllByPage(int offset) : offset ์ผ๋ก๋ถํฐ 10๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.countAll() : ์ ์ฒด ๊ฒ์๊ธ์ ๊ฐฏ์๋ฅผ ์ํ ์ฟผ๋ฆฌ<c:forEach begin="${pageInfo.beginPageNumber}" end="${pageInfo.endPageNumber}"
var="pageNumber">
<c:url var="link" value="/">
<c:param name="page" value="${pageNumber}"/>
</c:url>
<li class="page-item ${pageInfo.currentPageNumber eq pageNumber ? 'active' : ''}">
<a class="page-link"
href="${link}">${pageNumber}</a>
</li>
</c:forEach>
๊ฒ์๊ธ ๋ชฉ๋ก ํ๋ฉด(home.jsp)
<%--์ด์ --%>
<c:if test="${pageInfo.prevPageNumber > 0}">
<li class="page-item">
<c:url var="prevPageLink" value="/">
<c:param name="page" value="${pageInfo.prevPageNumber}"/>
</c:url>
<a class="page-link" href="${prevPageLink}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<%--๋ค์--%>
<c:if test="${pageInfo.nextPageNumber < pageInfo.lastPageNumber}">
<li class="page-item">
<c:url var="nextPageNumber" value="/">
<c:param name="page" value="${pageInfo.nextPageNumber}"/>
</c:url>
<a class="page-link" href="${nextPageNumber}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
<%--๋งจ ์ฒ์--%>
<c:if test="${pageInfo.currentPageNumber > 1}">
<li class="page-item">
<c:url var="fistPageLink" value="/">
<c:param name="page" value="1"/>
</c:url>
<a class="page-link" href="${fistPageLink}" aria-label="Previous">
<span aria-hidden="true">««</span>
</a>
</li>
</c:if>
<%--๋งจ ๋--%>
<c:if test="${pageInfo.currentPageNumber < pageInfo.lastPageNumber}">
<li class="page-item">
<c:url var="lastPageLink" value="/">
<c:param name="page" value="${pageInfo.lastPageNumber}"/>
</c:url>
<a class="page-link" href="${lastPageLink}" aria-label="Next">
<span aria-hidden="true">»»</span>
</a>
</li>
</c:if>
