레퍼런스 : https://velog.io/@max9106/Spring-Boot-JPA-MySQL-%ED%8E%98%EC%9D%B4%EC%A7%95
프로젝트 전체 소스코드 : https://github.com/rawfishthelgh/boardcrud.git
- list.html에서 pageList에서 pageNum을 하나씩 꺼내와 페이징 처리를 하고 있다.
- page 링크를 누르면 get요청으로 pageNum을 넘겨준다.
- 메인 페이지를 보여줄 때 기존 컨트롤러 중 List 에서 @RequestParam을 통해 요청에서 page 값을 받아 해당 페이지의 게시글만 볼 수 있게끔 보여준다.
- page 값의 기본값은 1이므로 page값을 받지 않고 처음 mainpage에 들어갈 땐 자동적으로 1페이지 값이 들어온다.
- 해당 페이지에 해당하는 게시글들만 보여줘야 하기 때문에, 기존에 구현된 Service의 getBoardList에도 페이지번호를 줘야한다.
- pageList는 Service에 구현할 것이며, 전체 페이지 목록을 보여준다. 게시글 수가 몇이냐에 따라 목록 수가 결정된다.
- 한 페이지에 게시글이 총 4개까지 보여지게, 한 페이지에 총 5페이지까지 페이지 목록이 설정되도록 명시한다.
- getBoardList에서 넘겨준 페이지 번호를 통해, 받은 페이지 번호의 게시글만 보여지도록 해야한다.
repository에서 게시글을 가져오는 findAll에 Pageable 인터페이스 구현체(PageRequest.of)를 전달해주면 페이징을 할 수 있다.
- PageRequest.of(limit값, 가져올 양, 정렬방식) 으로 사용할 수 있다.(limit는 실제 페이지 번호와 SQL의 limit가 다르기 때문에 '현재 페이지 - 1'값을 준다.)
- 따라서 게시글 4개씩 생성일 순으로 가져오는 것이다.
- Page 객체에 미리 구현된 getContent를 사용하면, 리스트를 꺼낼 수 있다.
- Page 객체를 활용해 반환하면 다양한 pagination 관련 메소드를 사용할 수 있다.(참고 : https://velog.io/@albaneo0724/Spring-Pagination%EA%B3%BC-Page-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Pageable)
- 총 게시글 갯수를 나타내는 getPageList를 구현하자
- getBoardCount를 통해 repository의 모든 객체의 수를 받아온다.
- 총 게시글을 한 페이지 당 보여지게 할 게시글 수로 나누고 소수 점이 있을 때 올림하면 게시글에서 총 필요한 페이지 수를 알 수 있다.(즉 게시글 수가 5고 페이지당 보여줄 게시글 수가 4면 5/4=1.25 -> 올림하면 2 이므로 총 2페이지가 필요하다.)
- 현재 페이지를 기준으로 블럭의 마지막 페이지를 계산한다. 즉 현재 페이지가 1이고, 총 페이지 수가 7인데 페이지가 한 페이지에 5개씩 보여준다면, 1+5인 6이 7보다 작으므로 마지막 페이지는 6이 되고, 현재 페이지가 3이라면 3+5인 8이 7보다 크므로 마지막 페이지는 7이 된다.
- 만약 현재 페이지 넘버가 3보다 작거나 같으면 시작 페이지는 1, 그렇지 않으면 현재 페이지보다 2 작은 수가 시작 페이지가 되도록 한다.
- 현재 페이지를 기준으로 블럭의 마지막 페이지까지 for문을 돌려 현재 페이지부터 마지막 페이지까지 1씩 늘린 값으로 pageList에 넣은 후 리턴한다.