1. 페이지 넘기기
게시글의 페이지를 넘기기 위해 부트스트랩의 pagination 을 활용한다.
w3school 의 예제를 활용했다.
resources/index.mustache
<ul class="pagination d-flex justify-content-center">
<li class="page-item {{#first}}disabled{{/first}}"><a class="page-link" href="?page={{prevPage}}">Previous</a></li>
<li class="page-item"><a class="page-link" href="/?page=0">1</a></li>
<li class="page-item"><a class="page-link" href="/?page=1">2</a></li>
<li class="page-item"><a class="page-link" href="/?page=2">3</a></li>
<li class="page-item"><a class="page-link" href="/?page=3">4</a></li>
<li class="page-item"><a class="page-link" href="/?page=4">5</a></li>
<li class="page-item {{#last}}disabled{{/last}}"><a class="page-link" href="?page={{nextPage}}">Next</a></li>
</ul>
지금 페이지는 게시글 조회를 할때 때로 DB는 조회하지 않고 전체 글을 21개로 고정하고 만들었다.
2. 컨트롤러
@GetMapping("/")
public String index(HttpServletRequest request,@RequestParam(defaultValue = "0")int page) {
List<Board> boardList = boardRepository.findAll(page);
request.setAttribute("boardList", boardList);
int currentPage = page;
int nextPage = currentPage + 1;
int prevPage = currentPage - 1;
request.setAttribute("nextPage", nextPage);
request.setAttribute("prevPage", prevPage);
boolean first = (currentPage == 0 ? true : false);
request.setAttribute("first", first);
int totalPage= boardRepository.count();
int totalCount = totalPage / 5;
boolean last = (currentPage == totalCount ? true : false);
//mustache 는 반복문을 사용하기 위해 배열이나 컬렉션이 필요하다.
// 따라서 전체 페이지의 개수만큼 반복문으로 변수를 대입해주어야 한다.
List<Integer> numberList = new ArrayList<>();
int allPage;
if(totalPage%5==0){
allPage = totalCount -1 ;
for(int i=1;i<=allPage;i++){
numberList.add(i);
// 저장된 List 데이터는 리퀘스트 객체에 담겨 View 로 전달된다.
request.setAttribute("numberList",numberList);
}
}else if(totalPage%5!=0){
allPage = totalCount ;
for(int i=1;i<=allPage;i++){
numberList.add(i);
request.setAttribute("numberList",numberList);
}
}
request.setAttribute("last", last);
return "index";
}
전체 게시글은 boardRepository의 count 메서드를 통해 전체 데이터의 개수를 조회한 후
페이지에 화면을 출력한다. 작성된 게시글의 수에 따라서 유동적으로 페이지 수가 변화된다.
한페이지에 5개씩 표시되도록 만들었다.
첫 페이지와 마지막 페이지는 비활성화도되도록 설정한다.
3. 레파지토리
board/BoardRepository
public int count() {
Query query = em.createNativeQuery("select count(*) from board_tb");
Long count = (Long) query.getSingleResult();
return count.intValue();
}
getSingleResult 는 오브젝트 타입을 출력한다. int로 받고 싶지만 받아지지 않아 Long 타입으로 받은 후 count.intValue() 메서드를 통해 int 값을 리턴한다.
4. 페이지 보기
index.mustache
<ul class="pagination d-flex justify-content-center">
<li class="page-item {{#first}}disabled{{/first}}"><a class="page-link" href="?page={{prevPage}}">Previous</a></li>
{{#numberList}}
<li class="page-item"><a class="page-link" href="/?page={{.}}">{{.}}</a></li>
{{/numberList}}
<li class="page-item {{#last}}disabled{{/last}}"><a class="page-link" href="?page={{nextPage}}">Next</a></li>
</ul>
컨트롤러에서 전달된 numberList 를 반복문으로 표시한다.

게시글이 46개가 있을 때 9번 페이지 까지 만들어진다.
페이지 번호가 만들어졌다. 첫 페이지는 Previous 버튼이 비활성된다.

마지막 페이지를 조회하면 Next는 비활성 된다.

게시글을 삭제하면 DB의 전체 데이터 수가 줄기 때문에 게시글의 페이지 수도 같이 줄어든다.
Share article