[Spring] Java pagination ๊ตฌํ˜„

hisungmiยท2025๋…„ 12์›” 22์ผ

Java-Spring

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

โœ…pagination ๊ตฌํ˜„

๐Ÿ’ก ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ๋งŽ์€ ์–‘์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์‰ฝ๋„๋ก ์—ฌ๋Ÿฌ ํ™”๋ฉด์— ๋‚˜๋ˆ„๊ณ , ๋ถ„ํ• ๋œ ํ™”๋ฉด์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์š”์†Œ์ด๋‹ค.

๐Ÿ“Œ ํ•„์š”ํ•œ ํŒŒ์ผ
XML, Service, VO, ServiceImpl, Controller, JSP, Mapper

MyBatic ๊ธฐ๋ฐ˜์ด๊ธฐ์— DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ™”๋ฉด์— ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

๐Ÿ“Œ page์— ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์€
pageNo, pageSize, totalCount, totalPage์ด๋‹ค.

๋จผ์ € totalCount๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

SELECT COUNT(*)
FROM sm_board
WHERE del_yn != 'Y'

๊ทธ๋Ÿฐ ๋‹ค์Œ, ๊ฒŒ์‹œํŒ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ

MySQL ๊ธฐ๋ฐ˜์ด๊ธฐ์— LIMIT์„ ์‚ฌ์šฉํ•œ๋‹ค.
offSet, pageSize๋ฅผ ๋„ฃ์–ด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋ฆฌ์ŠคํŠธ๋งŒ ํ˜ธ์ถœ๋˜๊ฒŒ๋” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๐Ÿ’ก ์ด๋•Œ, MySQL์—์„œ LIMIT n, m ์„ ์‚ฌ์šฉํ•ด์„œ, n๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ m๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

SELECT *
FROM sm_board
WHERE del_yn != 'Y'
ORDER BY created_at desc
LIMIT #{offSet}, #{pageSize};

ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์œ„ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์€ ์™„๋ฃŒ!

๊ทธ๋‹ค์Œ pageVO๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
๊ธฐ์กด์— ์žˆ๋˜ BoardVO ์— extends๋ฅผ ํ•˜์—ฌ ์ž์—ฐ์Šค๋ž˜ ํ˜ธ์ถœ๋˜๊ฒŒ๋” ํ•œ๋‹ค.

<public class SmBoardVO extends SmPageVO

page.VO

private int pageNo = 1;
private int pageSize = 10;
private int totalCount;

public int getOffset() {
    if (pageNo < 1) pageNo = 1;
    return (pageNo - 1) * pageSize;
}

public int getPageNo() {
    return pageNo;
}

public void setPageNo(int pageNo) {
    this.pageNo = pageNo;
}

public int getPageSize() {
    return pageSize;
}

public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
}
//์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜, ์ด ๊ธ€ ๊ฐœ์ˆ˜ ๋‚˜๋ˆ„๊ธฐ 10 (๋ฐ‘์— ๋ฒˆํ˜ธ)
public int getTotalPage() {
    return (int) Math.ceil((double) totalCount / pageSize);
}
public int getTotalCount() { return totalCount; }
public void setTotalCount(int totalCount) { this.totalCount = totalCount; }

ํŽ˜์ด์ง€๋Š” ๊ธฐ๋ณธ๊ฐ’ 1, ์‚ฌ์ด์ฆˆ๋Š” 10์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค.
MySQL์˜ LIMIT์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ

ํŽ˜์ด์ง€offset
1ํŽ˜์ด์ง€0
2ํŽ˜์ด์ง€10
9ํŽ˜์ด์ง€80

์ด๋ผ์„œ ๐Ÿ‘‰ +1 ์—†๋Š” ๊ณ„์‚ฐ์„ ์จ์•ผ ํ•œ๋‹ค.

boardController.java

@RequestMapping(value = "/list", method = RequestMethod.GET)
    public String boardPage(SmBoardVO vo, ModelMap model) throws Exception {
    	//์ด ๊ธ€ ๊ฐœ์ˆ˜
        int totalCount = smBoardService.selectBoardListCnt(vo);
        vo.setTotalCount(totalCount); //์„ธํŒ…ํ•ด์ฃผ๊ธฐ

        List<SmBoardVO> boardList = smBoardService.selectBoardList(vo);

        model.addAttribute("num", totalCount);
        model.addAttribute("boardList", boardList);
        model.addAttribute("page",vo);
        return "smSolution/adm/board/board_list";
    }

์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด ๊ธ€ ๊ฐœ์ˆ˜๋ฅผ DB์—์„œ ๋ถˆ๋Ÿฌ์™€ ์„ธํŒ…ํ•ด์ค€๋‹ค.
pageNo, pageSize๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ 1, 10 ์ด ์„ธํŒ…๋œ๋‹ค.


ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ jsp๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•ด์ค€๋‹ค.

pagination.jsp

<c:set var="pageNo" value="${page.pageNo}" />
<c:set var="pageSize" value="${page.pageSize}" />
<c:set var="totalPage"
       value="${page.totalPage}" />

<div class="pagination">

    <!-- ์ด์ „ -->
    <c:if test="${pageNo > 1}">
        <a class="page-btn" href="?pageNo=${pageNo - 1}">์ด์ „</a>
    </c:if>

    <!-- ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ -->
    <c:forEach var="i" begin="1" end="${totalPage}">
        <c:choose>
            <c:when test="${i == pageNo}">
                <strong class="page-btn" >${i}</strong>
            </c:when>
            <c:otherwise>
                <a class="page-btn" href="?pageNo=${i}">${i}</a>
            </c:otherwise>
        </c:choose>
    </c:forEach>

    <!-- ๋‹ค์Œ -->
    <c:if test="${pageNo < totalPage}">
        <a class="page-btn" href="?pageNo=${pageNo + 1}">๋‹ค์Œ</a>
    </c:if>
</div>

์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

<%@ include file="../../main/pagination.jsp" %>
       

โœ…์ตœ์ข… ํ™”๋ฉด

โœ…์ „์ฒด ํ๋ฆ„

๋ธŒ๋ผ์šฐ์ €
 โ†’ GET /board/list?pageNo=2
   โ†’ Controller
     โ†’ Service
       โ†’ Mapper (MyBatis)
         โ†’ MySQL
       โ† ๊ฒฐ๊ณผ
     โ† Model ์„ธํŒ…
   โ†’ JSP (board.jsp)
     โ†’ pagination.jsp include
  1. page๋ฅผ ํด๋ฆญํ•˜์—ฌ pageNo = 2, pageSize = 10 ์ด๋ผ๋Š” ๊ฐ’์„ ์„ธํŒ…
  2. Controller์—์„œ Mapper๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ VO์— getOffSet์„ ๊ณ„์‚ฐํ•œ๋‹ค.
  3. (pageNo - 1) * pageSize; ex) 2 => offset = 10
  4. xml์—์„œ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ์ฟผ๋ฆฌ ํ˜ธ์ถœ
  5. ์กฐํšŒ๋œ ๋ชฉ๋ก model ์„ธํŒ…
  6. jsp ํ‘œํ˜„
profile
๋‚œ ์„ฑ๋ฏธ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€