KoreaIt Academy/Spring Boot

[Spring Boot] 페이징 처리 - Criteria, PageDTO

hongeeii 2021. 10. 13.
728x90
반응형

1. 페이징(Paging)이란? 

페이징은 사용자가 어떤 데이터를 필요로 할 때, 전체 데이터의 일부분을 보여주는 것을 말합니다.

예를 들면, 게시글이 쌓이다 보면 게시글 갯수가 계속해서 늘어납니다.

이 게시글들을 한 페이지에 다 담기에는 무리가 있습니다.

로딩 속도도 느려지고 필요한 데이터를 찾기도 힘듭니다.

이러한 문제점을 해결하기 위해 페이징이 필요 합니다.

 

2. 공통 페이징 파라미터 처리용 클래스 만들기

페이징과 검색 처리는 다음과 같이 몇 가지 데이터(파라미터)를 필요로 합니다.

데이터의 내용은 다음과 같습니다.

pageNum:

현재 페이지의 번호를 의미합니다.

amount:

페이지당 출력할 데이터 개수를 의미합니다.

type:

검색 키워드를 의미합니다.

keyword :

검색 유형을 의미합니다.

ex) 전체, 제목, 내용, 작성자 등

위에 명시된 파라미터들을 컨트롤러에서 @RequestParam으로 일일이 전달받는 방법은 별로 효율적이지 않고,

파라미터의 개수가 늘어난다거나 했을 경우,

파라미터의 관리와 수집이 까다로워지기 때문에

공통으로 사용할 수 있는 하나의 클래스로 처리하는 것이 좋습니다.

vo 패키지에 Criteria클래스를 추가합니다.

 

3. 페이징 정보(화면 하단 페이지 번호) 계산용 클래스 만들기

게시글 리스트에서 전체 데이터 개수를 기준으로

화면 하단에 보이는 페이지 개수를 계산하는 용도의 클래스를 만듭니다.

 

pageCount :

화면 하단에 출력할 페이지의 사이즈를 의미합니다.

ex) 1~5, 1~10, 1~20 등

 

startPage:

pageCount 가 10이고, currentPageNo가 3이라면 1페이지를 의미합니다.

endPage :

pageCount 가 10이고, currentPageNo가 3이라면 10페이지를 의미합니다.

 

realEnd :

실제 마지막 page번호를 의미합니다.

endPage가 realEnd보다 클 수 없으므로 이를 통해 연산하여 줍니다.

 

prev :

이전 페이지 존재 여부를 확인하는 방법은 간단합니다.

예를 들어, 현재 페이지 번호가 3이라면, 첫 페이지 번호는 1이 됩니다.

첫 페이지 번호가 1이면 false, 1이 아니면 true가 됩니다.

next :

endPage가 realEnd보다 작으면 true가 됩니다.

 

total :

전체 데이터의 개수를 의미합니다.

 

criteria :

페이지 번호 계산에 필요한 Criteria 클래스의 멤버 변수들에 대한 정보를 가지는 변수입니다.

 

 

vo패키지에 PageDTO클래스를 추가해 줍니다.

기본생성자를 만들고, total, pageCount, Criteria를 매개변수로 받는 생성자를 선언해서

인스턴스 변수를 계산하여 넣어주면 생성자만 호출하면 페이징 처리를 할 수 있습니다.​

 

 

4. Mapper 인터페이스와 XML 변경

  <!--    게시글 목록 가져오기-->
    <select id="getList" resultType="boardVO">
        <![CDATA[
        SELECT BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
        FROM
        (
            /*알리아스를 붙인 컬럼에 WHERE절에서 접근할 때에는 FROM 절에 작성된 테이블의 컬럼과 동일한 이름으로만 사용이 가능하다.*/
            SELECT /*+ INDEX_DESC(TBL_BOARD PK_BOARD) */
            ROWNUM R, BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
            FROM TBL_BOARD
            WHERE ROWNUM <= #{pageNum} * #{amount}
        )
           WHERE R> (#{pageNum}-1) * #{amount}
        ]]>

    </select>

 

 

5. DAO 변경

 

6. Service와 ServiceImple 변경

 

 

7. 컨트롤러(Presentation 과 Business 계층을 이어주는)  변경

 

 

8. list.html 에서 페이징 처리

 <header class="major">
                <h1>Board</h1>
                <p>게시판 목록</p>
            </header>
            <!--href에 알맞는 URL 설정-->
            <h3><a href="/board/register" class="button small">글 등록</a></h3>
            <div class="table-wrapper">
                <table>
                    <thead>
                    <tr class="tHead">
                        <th class="bno">번호</th>
                        <th class="title">제목</th>
                        <th class="writer">작성자</th>
                        <th class="regDate">작성일</th>
                        <th class="updateDate">수정일</th>
                    </tr>
                    </thead>
                    <tbody>
                    <th:block th:each="board : ${list}">
                        <tr class="tBody" th:object="${board}">
                            <td class="bno" th:text="*{bno}"></td>
                            <td class="title"><a id="goRead" th:href="*{bno}" th:text="*{title}"></a></td>
                            <td class="writer" th:text="*{writer}"></td>
                            <td class="regDate" th:text="*{regDate}"></td>
                            <td class="updateDate" th:text="*{updateDate}"></td>
                        </tr>
                    </th:block>
                    </tbody>
                    <tfoot>
                    </tfoot>
                </table>
                <div th:object="${pageMaker}">
                    <div class="big-width" style="text-align: center">
                        <a class="changePage" th:if="*{prev}" th:href="*{startPage - 1}"><code>&lt;</code></a>
                        <th:block th:each="num : ${#numbers.sequence(pageMaker.getStartPage(), pageMaker.getEndPage())}">
                            <code th:if="${pageMaker.criteria.getPageNum() == num}" th:text="${num}"></code>
                            <a class="changePage" th:unless="${pageMaker.criteria.getPageNum() == num}" th:href="${num}"><code th:text="${num}"></code></a>
                        </th:block>
                        <a class="changePage" th:if="*{next}" th:href="*{endPage + 1}"><code>&gt;</code></a>
                    </div>
                    <div class="small-width" style="text-align: center">
                        <a class="changePage" th:if="*{criteria.pageNum > 1}" th:href="*{criteria.pageNum - 1}"><code>&lt;</code></a>
                        <code th:text="*{criteria.pageNum}"></code>
                        <a class="changePage" th:if="*{criteria.pageNum < realEnd}" th:href="*{criteria.pageNum + 1}"><code>&gt;</code></a>
                    </div>
                    <form action="/board/list" th:object="${criteria}" name="pageForm">
                        <input type="hidden" name="pageNum" th:field="*{pageNum}">
                        <input type="hidden" name="amount" th:field="*{amount}">
                    </form>
                </div>
            </div>
        </div>

 

 

9. 어플리케이션 실행

 

 


이상으로 Spring Boot 페이징 처리를 마치겠습니다.

728x90
반응형

추천 글