Spring Boot에서 @PageableDefault 애노테이션은 Spring Data의 페이징 처리 기능에서 기본 페이지 크기, 정렬 등을 설정할 때 사용됩니다. 이 애노테이션은 컨트롤러 메소드의 파라미터로 Pageable 객체를 받을 때, 이 Pageable 객체의 기본 값을 지정하는 데 사용됩니다. 예를 들어, 사용자가 페이지 번호나 크기를 명시하지 않았을 경우 기본적으로 사용될 값들을 설정할 수 있습니다.
Spring Data의 Pageable 인터페이스를 사용할 때, 컨트롤러 메서드의 파라미터로 Pageable 객체를 직접 받음으로써, Spring MVC가 HTTP 요청의 쿼리 파라미터(page, size, sort 등)에서 페이지네이션과 관련된 정보를 자동으로 추출하고, 해당 정보를 바탕으로 Pageable 객체를 생성하고 이 객체를 사용하여 해당하는 페이지의 데이터를 조회합니다.
즉, 컨트롤러에서 페이지 번호를 별도로 받지 않아도 됩니다. 대신, Pageable을 파라미터로 사용하여 Spring Framework가 자동으로 처리하도록 하는 것이 일반적인 접근 방식입니다
사용 방법
@PageableDefault 애노테이션은 다음과 같은 속성들을 가질 수 있습니다:
- size: 한 페이지에 표시할 아이템의 수입니다.
- page: 페이지 번호입니다 (0부터 시작).
- sort: 정렬 기준이 될 속성의 이름입니다.
- direction: 정렬 방향 (ASC 또는 DESC).
@GetMapping("/entities")
public Page<MyEntity> myMethod(Model model, @PageableDefault(size = 10, sort = "createdAt", direction = Direction.DESC) Pageable pageable) {
Page<MyEntity> list = myEntityRepository.findAll(pageable);
int nowPage = list.getPageable().getPageNumber() + 1;
int startPage = Math.max(nowPage - 4, 1);
int endPage = Math.min(startPage + 5, list.getTotalPages());
model.addAttribute("list", list);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "entities"
}
동적 범위 조정, 첫 페이지 및 마지막 페이지
사용자가 현재 보고 있는 페이지에 따라 표시되는 페이지 범위를 조정하여,
항상 일관된 수의 페이지 링크를 보여주는 방법
int nowPage = list.getPageable().getPageNumber() + 1; // 현재 페이지 번호
int totalPages = list.getTotalPages(); // 전체 페이지 수
int pageRange = 5; // 표시할 페이지 범위 (최대 페이지 수)
// 시작 페이지 계산
int startPage = Math.max(1, nowPage - pageRange / 2);
// 종료 페이지 계산
int endPage = startPage + pageRange - 1;
// 종료 페이지가 전체 페이지 수를 초과하지 않도록 조정
if (endPage > totalPages) {
endPage = totalPages;
startPage = Math.max(1, endPage - pageRange + 1); // 시작 페이지 재조정
}
// 모델에 추가
model.addAttribute("list", list);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
model.addAttribute("totalPages", totalPages); // 전체 페이지 수 추가
<!-- 첫 페이지로 이동 -->
<a th:if="${nowPage > 1}" th:href="@{/board/list(page=0)}">첫 페이지</a>
<!-- 페이지 번호들 -->
<th:block th:each="pageNum : ${#numbers.sequence(startPage, endPage)}">
<a th:href="@{/board/list(page=${pageNum-1})}" th:text="${pageNum}">1</a>
</th:block>
<!-- 마지막 페이지로 이동 -->
<a th:if="${nowPage < totalPages}" th:href="@{/board/list(page=${totalPages-1})}">마지막 페이지</a>
반응형
'Java > Spring' 카테고리의 다른 글
[Java] DTO 쉽게 만드는 법 (record) (0) | 2024.04.27 |
---|---|
[Spring]Jpa를 이용하여 검색기능 사용하기(pageable 사용) (0) | 2024.04.08 |
[Spring] @DeleteMapping 사용방법 (0) | 2024.04.02 |
[Spring]Model 객체와 @ModelAttribute (0) | 2024.04.02 |
[Spring]MariaDB 연동 (0) | 2024.03.28 |