본문 바로가기

Spring

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