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="| ${pageNum} |"></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="| 끝|"></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 |