navis
Spring data jpa 타임리프 페이징 본문
728x90
Criteria
@Data
public class Criteria {
private int pageNum;
private int amount; // 현재 페이지, 페이지 당 보여질 게시물 갯수
private int showStat;
private String keyword;
private String type; // 검색 키워드, 검색 타입
// private String[] typeArr; //검색 타입 배열
// 기본 생성자 -> 기본세팅 : pageNum=1, amount=10
public Criteria() {
this(1, 10);
}
// 생성자 -> 원하는 pageNum, 원하는 amount
public Criteria(int pageNum, int amount) {
super();
this.pageNum = pageNum;
this.amount = amount;
}
// Criteria 인스턴스에서 Pageable 객체 생성
public Pageable toPageable() {
return PageRequest.of(this.pageNum - 1, this.amount, Sort.Direction.DESC, "boardKey"); // 예시로 "id" 기준으로 내림차순 정렬
}
}
리포지토리
// 검색어 없이 특정 상태의 게시글 페이지 조회
Page<Board> findByBoardStatus(String boardStatus, Pageable pageable);
// 검색어를 포함하는 게시글 페이지 조회 (제목과 내용에서 검색)
@Query("SELECT b FROM Board b WHERE b.boardStatus = :boardStatus AND (b.boardTitle LIKE %:keyword% OR b.boardContent LIKE %:keyword%)")
Page<Board> findByKeywordAndBoardStatus(String keyword, String boardStatus, Pageable pageable);
서비스
// 게시글 리스트 조회
@Override
@Transactional(readOnly = true)
public Map<String, Object> findByIdAll(Criteria cri) {
Map<String, Object> map = new HashMap<>();
Pageable pageable = cri.toPageable(); // Criteria 객체에서 Pageable 객체 생성
Page<Board> page; // 조회 결과를 담을 Page 객체 초기화
// 페이징 처리를 위해 조건에 맞는 게시글 목록 조회
if (cri.getKeyword() == null || cri.getKeyword().isEmpty()) {
page = boardRepository.findByBoardStatus(STATUS, pageable);
} else {
page = boardRepository.findByKeywordAndBoardStatus(cri.getKeyword(), STATUS, pageable);
}
// 조회된 결과에서 총 게시물 수 및 게시물 목록 추출
int total = (int) page.getTotalElements(); // 총 게시물 수
List<Board> boardList = page.getContent(); // 현재 페이지에 해당하는 게시물 목록
// 페이징 정보 생성
PageMakerDTO pageMaker = new PageMakerDTO(total, cri);
// 결과 Map에 페이징 정보와 게시물 목록 추가
map.put("pageMaker", pageMaker);
map.put("list", boardList);
return map;
}
컨트롤
// 게시글 리스트 조회
@GetMapping("/board")
public String getBoardList(Criteria cri, Model model) {
Map<String, Object> map = boardService.findByIdAll(cri);
model.addAttribute("list", map.get("list"));
model.addAttribute("pageMaker", map.get("pageMaker"));
return "";
}
템플릿
<html xmlns:th="http://www.thymeleaf.org">
<div id="paging">
<ul class="pageInfo">
<!-- 이전 페이지 버튼, 조건부 렌더링을 사용하여 표시 여부 결정 -->
<li th:if="${pageMaker.prev}" class="pageInfo_btn previous">
<a th:href="@{/adminShowList(pageNum=${pageMaker.startPage - 1}, amount=${pageMaker.cri.amount})}">◀ 이전</a>
</li>
<!-- 페이지 번호 버튼들, 페이지 번호 범위에 따라 반복적으로 생성 -->
<li th:each="pageNum : ${#numbers.sequence(pageMaker.startPage, pageMaker.endPage)}"
th:class="${pageMaker.cri.pageNum == pageNum} ? 'pageInfo_btn active' : 'pageInfo_btn'">
<a th:href="@{/adminShowList(pageNum=${pageNum}, amount=${pageMaker.cri.amount})}" th:text="${pageNum}"></a>
</li>
<!-- 다음 페이지 버튼, 조건부 렌더링을 사용하여 표시 여부 결정 -->
<li th:if="${pageMaker.next}" class="pageInfo_btn next">
<a th:href="@{/adminShowList(pageNum=${pageMaker.endPage + 1}, amount=${pageMaker.cri.amount})}">다음 ▶</a>
</li>
</ul>
<div class="clear"></div>
</div>
<form id="moveForm" th:action="@{/adminShowList}" method="get">
<input type="hidden" name="pageNum" th:value="${pageMaker.cri.pageNum}">
<input type="hidden" name="amount" th:value="${pageMaker.cri.amount}">
<!-- 여기에 추가적인 검색 조건 필드를 포함시킬 수 있습니다. -->
</form>
'Spring' 카테고리의 다른 글
Spring Security Config설정 Spring boot 3.2버전 (0) | 2024.02.14 |
---|