01/14ページング処理コード

52673 ワード

common > pagingConst
package com.icia.board.common;

public class PagingConst {
    public static final int PAGE_LIMIT = 5; // 한 페이지에 보여줄 글 갯수
    public static final int BLOCK_LIMIT = 3; // 한 화면에 보여줄 페이지 갯수
}
pagingDTO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BoardPagingDTO {
    private Long boardId;
    private String BoardWriter;
    private String BoardTitle;

}
さんこうえんざんし
テストコード
@Autowired
    private BoardService bs;
    @Autowired
    private BoardRepository br;
    
@Test
    @DisplayName("삼항연산자")
    public void test1(){
        int num = 10;
        int num1 = 0;
        if(num == 10) {
            num1 = 5;
        }else {
            num1 = 100;
        }

        num1 = (num==10)? 5 : 100;
        // 조건 ? t참일 때 : f 거짓일 때 좌변에 대입시킴.
    }

    @Test
    @Transactional
    @DisplayName("페이징테스트")
    public void pagingTest(){
        int page = 5;
        Page<BoardEntity> boardEntities = br.findAll(PageRequest.of(page, PagingConst.PAGE_LIMIT, Sort.by(Sort.Direction.DESC, "id")));
        //page 객체가 제공해 주는 메서드 확인
        System.out.println("boardEntities.getContent() = "+boardEntities.getContent()); //요청페이지에 들어있는 데이터
        System.out.println("boardEntities.getTotalElements() = " + boardEntities.getTotalElements()); //전체 글 갯수
        System.out.println("boardEntities.getNumber() = " + boardEntities.getNumber()); //요청페이지 JPA 기준
        System.out.println("boardEntities.getTotalPages() = " + boardEntities.getTotalPages()); // 전체 페이지 갯수
        System.out.println("boardEntities.getSize() = " + boardEntities.getSize()); //한 페이지에 보여지는 글 갯수
        System.out.println("boardEntities.hasPrevious() = " + boardEntities.hasPrevious()); // 이전 페이지 존재여부
        System.out.println("boardEntities.isFirst() = " + boardEntities.isFirst()); // 첫페이지인지 여부
        System.out.println("boardEntities.isLast() = " + boardEntities.isLast()); // 마지막페이지인지 여부

        //map() : 엔티티가 담긴 페이지 객체를 dto 가 담긴 페이지 객체로 변환해주는 역할
        Page<BoardPagingDTO> boardList = boardEntities.map(
                //board(엔티티 객체) : 엔티티 객체를 담기 위한 반복용 변수
                // Page<BoardEntity> -> Page<BoardPagingDTO>
                board -> new BoardPagingDTO(board.getId(),
                                            board.getBoardWriter(),
                                            board.getBoardTitle())

        );
        System.out.println("boardList.getContent() = "+boardList.getContent()); //요청페이지에 들어있는 데이터
        System.out.println("boardList.getTotalElements() = " + boardList.getTotalElements()); //전체 글 갯수
        System.out.println("boardList.getNumber() = " + boardList.getNumber()); //요청페이지 JPA 기준
        System.out.println("boardList.getTotalPages() = " + boardList.getTotalPages()); // 전체 페이지 갯수
        System.out.println("boardList.getSize() = " + boardList.getSize()); //한 페이지에 보여지는 글 갯수
        System.out.println("boardList.hasPrevious() = " + boardList.hasPrevious()); // 이전 페이지 존재여부
        System.out.println("boardList.isFirst() = " + boardList.isFirst()); // 첫페이지인지 여부
        System.out.println("boardList.isLast() = " + boardList.isLast()); // 마지막페이지인지 여부
    }
Controller
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;

//페이징처리(/board?page=5)
    //5번글(/board/5) 주소만으로 무엇을 요청하는 지 알자
    //주소값을 query String 방식으로 보내주기
    @GetMapping
    public String paging(@PageableDefault(page = 1)Pageable pageable, Model model){
        // @PageableDefault(page = 1) /board?page=5 무조건 page 라는 파라미터로 요청
        // 페이지 객체
        Page<BoardPagingDTO> boardList = bs.paging(pageable);
        model.addAttribute("boardList", boardList);
        int startPage = (((int) (Math.ceil((double) pageable.getPageNumber() / PagingConst.BLOCK_LIMIT))) - 1) * PagingConst.BLOCK_LIMIT + 1;
        int endPage = ((startPage + PagingConst.BLOCK_LIMIT - 1) < boardList.getTotalPages()) ? startPage + PagingConst.BLOCK_LIMIT - 1 : boardList.getTotalPages();
        model.addAttribute("startPage",startPage);
        model.addAttribute("endPage",endPage);
        return "board/paging";
    }
ServiceImpl
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

@Override
    public Page<BoardPagingDTO> paging(Pageable pageable) {
        int page = pageable.getPageNumber();
        //페이징처리를 JPA 로 하는데 요구하는 파라미터를 잘 써야함
        //요청한 페이지가 1이면 페이지값을 0으로 하고 1이 아니면 요청 페이지에서 1을 뺸다.
//        page = page - 1;
        page = (page==1)? 0 : (page-1);
        Page<BoardEntity> boardEntities = br.findAll(PageRequest.of(page, PagingConst.PAGE_LIMIT, Sort.by(Sort.Direction.DESC, "id")));
        // Entity 필드이름 "id" order by board_id desc
      //Page<BoardEntity> => Page<BoardPagingDTO>
        Page<BoardPagingDTO> boardList = boardEntities.map(
                //board(엔티티 객체) : 엔티티 객체를 담기 위한 반복용 변수
                // Page<BoardEntity> -> Page<BoardPagingDTO>
                board -> new BoardPagingDTO(board.getId(),
                        board.getBoardWriter(),
                        board.getBoardTitle())
        );
        return boardList;
    }
paging.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<body class="container">

<h2>회원제 게시판</h2>

<table class="table table-hover">
    <thead>
    <tr>
        <th scope="col">글 번호</th>
        <th scope="col">글쓴이</th>
        <th scope="col">글 제목</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="board: ${boardList}">
        <td th:text="${board.boardId}"></td>
        <td th:text="${board.boardWriter}"></td>
        <td><a th:href="@{|/board/${board.boardId}|}" th:text="${board.boardTitle}">제목</a></td>
    </tr>
    </tbody>
</table>

<!--
    브라우저 주소창에 보이는 주소값 : /board?page=1
    html 에서 타임리프로 작성하는 주소 값 : /board(page=1)
    /board
    /board/* => /board/(page=1)
-->

<div class="container">
    <ul class="pagination">
        <li class="page-item">
            <!--첫 페이지로 가는 링크-->
            <a class="page-link" th:href="@{/board(page=1)}">
                <span>First</span>
            </a>
        </li>

        <li th:class="${boardList.first} ? 'page-item disabled'">
            <!--boardList.first = isFirst() 링크값 # : 그 자리에 머무름
            boardList.number = getNumber() 내가 현재 3페이지 , getNumber 는 2페이지 이전으로 가려면 getNumber 를 그대로 가져가면 됨-->
            <a class="page-link" th:href="${boardList.first} ? '#' : @{/board(page=${boardList.number})}">
                <span>&lt;</span>
                <!-- = '<' html 에서는 &lt 로 써야함-->
            </a>
        </li>

        <!--startPage ~ endPage 까지 숫자를 만들어주는 역할-->
        <li th:each="page: ${#numbers.sequence(startPage, endPage)}"
            th:class="${page == boardList.number + 1} ? 'page-item active'">
            <a class="page-link" th:text="${page}" th:href="@{/board(page=${page})}"></a>
        </li>

        <!--다음 페이지 요청
        현재 3페이지를 보고 있다면 다음 페이지는 4페이지임.
        getNumber() 값은 2임
        따라서 4페이지를 보고 싶다면 getNumber()+2를 해야 컨트롤러에 4를 요청할 수 있음음-->
       <li th:class="${boardList.last} ? 'disabled'">
            <a class="page-link" th:href="${boardList.last} ? '#' : @{/board(page=${boardList.number + 2})}">
                <span>&gt;</span> <!--삼항연산자 사용-->
            </a>
        </li>

        <li class="page-item">
            <a class="page-link" th:href="@{/board(page=${boardList.totalPages})}">
                <span>Last</span>
            </a>
        </li>
    </ul>
</div>

</body>
</html>
html特殊文字コードの整理
https://postitforhooney.tistory.com/entry/HTML-HTML-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%BD%94%EB%93%9C%ED%91%9C-%EC%A0%95%EB%A6%AC