Purple Bobblehead Bunny

Backend/SPRINGBOOT

[SpringBoot] 게시판 만들기 9. 페이징 처리

준영어린이 2022. 11. 1. 16:28

 

 

우리는 페이징 처리 뿐만이 아니라, 정렬 순서도 생각을 해야 한다.

보통 페이지에서 공지사항이나, 자유게시판을 보면 최근에 올린 글이 제일 상단에 올라가게끔 구현을 해 놓는다.

 

 

우선 Controller로 가서

 

boardList를 수정한다. @PageableDefault라는 어노테이션을 사용하는데, 

메서드 매개변수로 Pageable을 받고, 브라우저 요청 파라미터로 Pageable에 값을 넘길 수 있다.

ex) localhost:8080/board/list?page=3&size=5

 

페이징을 처리 할 클래스도 따로 만들어 줘야 하고, 쿼리문도 적어줘야 하는데 findAll 메서드를 사용 할 때

pageable 클래스를 넘겨주면 간단하게 처리가 가능하다,

  • page : default 페이지
  • size : 한 페이지 게시글 수
  • sort : 정렬 기준 컬럼
  • direction : 정렬순서 ... DESC(역순)

 

서비스로 가서 게시물 리스트 로직도 바꿔 주자.

매개변수가 없을 땐 리턴 값을 List로 줬지만, 매개변수에 Pageable을 줘서 Page 클래스로 리턴을 해야 한다.

 

 

주소창에 파라미터값으로 page=3&size=5 를 줬더니 정상적으로 값이 넘겨진다.

 

이제 페이지 블럭을 구현 하자.

 

BoardController로 가서 

Page 타입의 제네릭 타입으로 Board를 넣고, list는 boardService의 boardList와 pageable을 넘겨준다.

(boardService.boardList(pageable)) 를 따로 빼줌.

 

nowPage는 현재 페이지를 보여주고,

list.getPageable().getPageNumber(); - pageable에서 넘어온 현재 페이지를 가져올 수 있다.

여기서 +1을 하는 이유는, Pageable에서 가져온 페이지는 0부터 시작 하기 때문에 +1을 했다.

 

startPage는 블럭에서 보여 줄 첫 페이지이고,

만약 현재 페이지가 1페이지라면, -4를 할 때 음수가 나오게 된다. 

자바의 Math.max() 메서드를 통해 두 값을 비교해서 높은 값을 꺼내게 되면, 1보다 작은 수가 나오지 않게 된다.

 

endPage는 블럭에서 보여 줄 마지막 페이지이고,

startPage와 마찬가지로 nowPage가 9이고, TotalPage가 10인데, nowPage에서 + 를 해버리게 되면

TotalPage를 넘어가게 된다.

그래서 자바의 Math,min() 메서드를 통해 두 값을 비교 해 현재 페이지 수 보다 넘어가지 않게 한다.

 

html에서 사용하기 위해 model을 이용해 startPage, nowPage, endPage를 뿌려주고

 

boardlist.html로 가자!

 

<th:block th:each="page : ${#numbers.sequence(startPage, endPage)}">
    <a th:if="${page != nowPage}" th:href="@{/board/list(page= ${page-1})}" th:text="${page}"></a>
    <strong th:if="${page == nowPage}" th:text="${page}"></strong>
</th:block>
  • th:text - 태그 안에 데이터 출력
  • th:each - 반복문
  • th:each - "${number : #niumber(시작 번호, 끝 번호)}" -> 시작 번호에서 끝 번호까지 반복
  • th:block - th:each를 사용하기 위해, th:block을 활용한다. 내부 태그들을 묶는 용도

 

첫 페이지는 1페이지로 가며, 3번을 누르게 되면 strong 태그에 의해 숫자가 진해진다.

Sort.Direction.DESC 로 인해 역순으로도 잘 보여진다.