본문 바로가기
백수/Spring

페이징 처리

728x90
반응형

1. 공통 서비스


public class PaginationService {
   
    private int rowCount = 10; // 한 페이지 당 보여줄 게시물 개수
    private int pageCount = 5; // 한 블럭에 몇 개의 페이지 개수

    public Map<String, Object> calculatePagination(int totalCount, int currentPage) {
       
                Map<String, Object> paginationMap = new HashMap<>();
                paginationMap.put("totalCount", totalCount);
                paginationMap.put("page", currentPage);

                // 총 페이지 개수 계산
                int totalPageCount = (int) Math.ceil((double) totalCount / rowCount);
                paginationMap.put("totalPageCount", totalPageCount);

                // 한 블럭의 시작 페이지 계산
                int startPage = ((currentPage - 1) / pageCount) * pageCount + 1;
                paginationMap.put("startPage", startPage);

                // 한 블럭의 끝 페이지 계산
                int endPage = Math.min(startPage + pageCount - 1, totalPageCount);
                paginationMap.put("endPage", endPage);

                // 이전 블록 버튼 생성 유무 판별
                boolean isPrev = startPage > 1;
                paginationMap.put("isPrev", isPrev);

                // 다음 블록 버튼 생성 유무 판별
                boolean isNext = endPage < totalPageCount;
                paginationMap.put("isNext", isNext);

                // offset 계산
                int offset = (currentPage - 1) * rowCount;
                paginationMap.put("offset", offset);

                return paginationMap;
    }
}

2. 컨트롤러

// 호출
    @GetMapping("호출_URL")
    public String byWeekDividendView(Model model
     @RequestParam(value = "page", defaultValue = "1") final int page
     )
    {

        Map<String, Object> map = new HashMap<>();
        map.put("page", page);
        map.put("rowCount", 10);
 
        List<Map> list = 조회서비스.조회(map);
 
        /* ### 페이징 처리 ### */
        int currentPage = page; // 현재 페이지
        int totalCount = Integer.parseInt(String.valueOf(list.get(0).get("TOTALPAGES"))); // 총 게시물 개수
       
        // Pagination 정보를 계산합니다.
        // PaginationService 객체를 생성합니다.
        Map<String, Object> paginationMap = paginationService.calculatePagination(totalCount, currentPage);

        /* ### 페이징 처리 ### */
        model.addAttribute("byWeekList", list); 
        model.addAttribute("page", page);
        model.addAttribute("pageVo", paginationMap);
       
        return "화면";
    }

3. SQL

<!-- 페이징-->
<select id = "list"  resultType="Map" parameterType="Map" >
            SELECT
                *
            FROM
                (
                SELECT
                    *
                FROM
                    (
                    SELECT
                        *
                        COUNT(*) OVER() AS totalPages
                    FROM
                        DUAL
                    WHERE
                        )
                WHERE
                    NO_  <![CDATA[ <=  ]]>  (#{page} * #{rowCount})
                                    )
                WHERE (((#{page}-1) * #{rowCount}) + 1) <![CDATA[  <=   ]]>   NO_

</select>

4. HTML

<!-- 페이징 처리 -->
          <nav aria-label="Page navigation example">
            <ul class="pagination justify-content-center">
              <!-- 맨 처음 페이지로 이동하는 버튼 -->
              <li class="page-item">
                <span th:if="${pageVo.startPage > 1}">
                  <a class="page-link" th:href="@{'/호출_URL?page=1'}" th:text="'처음'"></a>
                </span>
              </li>
              <!-- 이전 블록으로 이동하는 버튼 -->
              <li class="page-item">
                <span th:if="${pageVo.isPrev == true}">
                  <a class="page-link" th:href="@{'/호출_URL ?page=' + ${pageVo.startPage - 1}}" th:text="'이전'"></a>
                </span>
              </li>
              <!-- 시퀀스 보여주는 값을 변경. -->
              <li class="page-item" th:each="pageNum : ${#numbers.sequence(pageVo.startPage, pageVo.endPage)}">
                  <a class="page-link" th:href="@{'/호출_URL ?page=' + ${pageNum}}" th:text="|&emsp;${pageNum}&emsp;|"></a>
              </li>
              <li class="page-item">
              <!-- 다음 블록으로 이동하는 버튼 -->
              <span th:if="${pageVo.isNext == true}">
                  <a class="page-link" th:href="@{'/호출_URL ?page=' + ${pageVo.endPage + 1}}" th:text="'다음'"></a>
              </span>
              </li>
              <!-- 맨 뒷 페이지로 이동하는 버튼 -->
              <li class="page-item">
                <span th:if="${pageVo.endPage < pageVo.totalPageCount}">
                  <a class="page-link" th:href="@{'/호출_URL ?page=' + ${pageVo.totalPageCount}}" th:text="|&emsp;끝|"></a>
                </span>
              </li>
            </ul>
          </nav>
728x90
반응형

'백수 > Spring' 카테고리의 다른 글

비주얼 스튜디오 코드 프로젝트 생성 기본 설정  (0) 2023.10.18
ORM(Object Relation Mapping)  (0) 2023.07.14
영속성(Persistence)  (0) 2023.06.20
Spring 프레임워크  (0) 2023.05.31
어노테이션 기초 정리  (0) 2023.05.30