BoardController
@GetMapping
public String postList(Model model,
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam(required = false, defaultValue = "5") Integer size) {
model.addAttribute("resultMap", boardService.findAll(page, size));
return "board/postList";
}
@GetMapping("/{postId}")
public String postView(@PathVariable Long postId, Model model) {
log.info("postView");
Board post = boardService.findOne(postId).orElseThrow();
model.addAttribute("post", post);
return "board/post";
}
postList()
: 게시글 조회 메서드defaultValue
를 지정하여 게시글 조회 화면에서 기본적으로 첫페이지가 나타나고, 게시글 5개가 나타나도록 한다.BoardService
/**
* 게시글 전체 조회
*/
public HashMap<String, Object> findAll(Integer page, Integer size) {
HashMap<String, Object> listMap = new HashMap<>();
Page<Board> list = boardRepository.findAll(PageRequest.of(page, size));
listMap.put("list", list);
listMap.put("paging", list.getPageable());
listMap.put("totalCnt", list.getTotalElements());
listMap.put("totalPage", list.getTotalPages());
return listMap;
}
Spring Data JPA에서는 페이지 처리를 위한 PageRequest
객체를 지원하므로 간단하게 페이징 처리를 할 수 있다.
findAll()
: 게시글 전체 조회 메서드HashMap<String, Object>
를 반환postList.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div id="wrapper">
<div class="container">
<div class="col-md-12">
<div class="py-5 text-center">
<h2>게시판</h2>
</div>
<button class="btn btn-dark"
th:onclick="|location.href='@{/}'|" type="button">
홈 화면
</button>
<button class="btn btn-primary"
th:onclick="|location.href='@{/board/register}'|" type="button">
게시글 작성
</button>
<hr class="my-4">
<table class="table">
<thead>
<tr>
<th width="10%">게시글번호</th>
<th width="">제목</th>
<th width="20%">작성자</th>
<th width="20%">작성일</th>
</tr>
</thead>
<tbody>
<tr th:each="list,index: ${resultMap.list}" th:with="paging=${resultMap.paging}">
<td>
<span th:text="${(resultMap.totalCnt - index.index) - (paging.pageNumber * paging.pageSize)}"></span>
</td>
</td>
<td>
<a th:href="@{/board/{postId}(postId=${list.id})}"
th:text="${list.title}">제목</a>
</td>
<td th:text="${list.user.loginId}">작성자</td>
<td th:text="${list.registerDate}">작성일</td>
</tr>
</tbody>
</table>
<div class="row">
<div class="col">
<ul class="pagination">
<li class="page-item" th:if="${resultMap.totalPage} > 0" th:each="index : ${#numbers.sequence(1, resultMap.totalPage)}"
th:with="paging=${resultMap.paging}">
<a class="page-link"
th:href="@{/board/(page=${index-1},size=${paging.pageSize})}">
<span th:text="${index}"></span>
</a>
</li>
</ul>
</div>
</div>
<hr class="my-4">
</div>
</div>
</div>
</body>
th:each="list,index: ${resultMap.list}" th:with="paging=${resultMap.paging}"
th:text="${(resultMap.totalCnt - index.index) - (paging.pageNumber * paging.pageSize)}"
: 게시글 번호 지정th:href="@{/board/{postId}(postId=${list.id})}"
: 게시글 제목을 클릭하면 해당 게시글 상세 조회 화면으로 이동한다.th:if="${resultMap.totalPage} > 0"
: page 개수가 1개 이상이라면, 태그를 출력한다.th:href="@{/board/(page=${index-1},size=${paging.pageSize})}"
: 쿼리 파라미터로 현재 페이지 번호와 페이지 크기를 전달한다.
th:each
: 반복하려는 html 엘리먼트에 사용하여 콜렉션(Collection)을 반복
th:each="콜렉션 변수명, status 변수명:${리스트}"
th:with
: 변수형태의 값을 재정의
th:with="변수명=${...}"
참고: https://kitty-geno.tistory.com/124
<div>
태그 삭제게시글 조회 화면을 보면 가장 최근에 작성한 게시글이 1번이 되어 마지막 페이지에 나타난다.
내가 원하는 요구사항은 가장 최근에 작성한 게시글이 마지막 번호가 되어 가장 첫 페이지에 나타나도록 하는 것이다.
구글링을 통해서 해결 방법을 찾았다.
BoardController
에서 Pageable
객체를 생성하고 정렬 순서, 사이즈 등의 정보를 넣은 다음, boardService.findAll(pageable)
를 호출해 파라미터로 넘긴다.BoardService
에서 PageRequest
객체 대신 Pageable
객체를 사용한다.BoardController
수정@GetMapping
public String postList(Model model,
@PageableDefault(sort = "id", direction = Sort.Direction.DESC, size = 5) Pageable pageable) {
model.addAttribute("resultMap", boardService.findAll(pageable));
return "board/postList";
}
@PageableDefault
어노테이션을 사용해 간단하게 구현한다.
@PageableDefault
size
: 한 페이지에 담을 모델의 수를 정할 수 있다. 기본 값은 10이다.sort
: 정렬의 기준이 되는 속성을 정한다.direction
: 오름차순과 내림차순 중 기준을 선택할 수 있다.Pageable pageable
: PageableDefault 값을 갖고 있는 변수를 선언한다.
BoardService
수정 /**
* 게시글 전체 조회
*/
public HashMap<String, Object> findAll(Pageable page) {
HashMap<String, Object> listMap = new HashMap<>();
Page<Board> list = boardRepository.findAll(page);
listMap.put("list", list);
listMap.put("paging", list.getPageable());
listMap.put("totalCnt", list.getTotalElements());
listMap.put("totalPage", list.getTotalPages());
return listMap;
}
findAll()
메소드로 한다. findAll()
메소드 파라미터로 pageable
을 넣어준다.
PageRequest
를 사용해도 page를 정렬 할 수 있다.
ex)boardRepository.findAll(PageRequest.of(page, 5, Sort.by(Sort.Direction.DESC, "id")));
postList.html
수정
<div class="row">
<div class="col">
<ul class="pagination">
<li class="page-item" th:if="${resultMap.totalPage} > 0" th:each="index : ${#numbers.sequence(1, resultMap.totalPage)}"
th:with="paging=${resultMap.paging}">
<a class="page-link"
th:href="@{/board/(page=${index-1})}">
<span th:text="${index}"></span>
</a>
</li>
</ul>
</div>
</div>
size
파라미터 삭제
http://localhost:8080/board
http://localhost:8080/board/?page=0
http://localhost:8080/board/?page=1