์๋ ํ์ฌ์ ๊ฒ์ํ ์ํฉ์ด๋ค. ์ด์ ์์ฑ์๊ฐ ์ถ๊ฐ ๊ธ๊ณผ ๋ฌ๋ฆฌ ํ์ด์ง ๋ฒํธ์ ๊ฒ์ ๋ถ๋ถ์ด ์๊ธด ๊ฒ์ด ๋ณด์ธ๋ค. ์ด๋ฒ ๊ธ์์๋ ํ์ด์ง ์ฒ๋ฆฌ์ ๊ดํด์ ์์ฑํด๋ณด๊ฒ ๋ค.
JpaRepository์ findAll Method๋ฅผ ์ด์ฉํด์ DB์ ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ค๊ฒ ๋๋ฉด ๋ง ๊ทธ๋๋ก DB์ ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ค๊ฒ ๋๋ค. ์ด๋, Pageable์ด๋ผ๋ ํด๋์ค๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค๋ฉด page์ ์์ ํ ํ์ด์ง์ ๋ณด์ฌ์ค ๊ฒ์๊ธ์ ์์ธ size๋ฅผ ์ง์ ํ ์ ์๋ค.
ํ์ด์ง ์ฒ๋ฆฌ ์ boardListForm
@GetMapping("/board/list")
public String boardListForm(Model model) {
model.addAttribute("board", boardService.boardList());
return "boardList";
}
ํ์ด์ง ์ฒ๋ฆฌ ํ boardListForm
@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
model.addAttribute("board", boardService.boardList(pageable));
return "boardList";
}
์๋ ์ปจํธ๋กค๋ฌ ์ค GET ์์ฒญ์ ๋ฐ๋ boardList ๋ถ๋ถ์ด๋ค. ํ์ด์ง ์ฒ๋ฆฌ ์ ๊ณผ ํ์ ์ฐจ์ด์ ์ ์ค๋ช ํด์ฃผ๊ฒ ๋ค.
@PageableDefault(page = , size = , sort = , direction = )
Pageable ๊ฐ์ฒด๋ฅผ model์ ํตํด boardService์ boardList๋ก ๋๊ฒจ์ค๋ค.
boardService/boardList ๋ณ๊ฒฝ ์
public List<Board> boardList() {
return boardRepository.findAll();
}
boardService/boardList ๋ณ๊ฒฝ ํ
public Page<Board> boardList(Pageable pageable) {
return boardRepository.findAll(pageable);
}
์ด๋ boardService/boardList์๋ Pagealbe ์ค์ ์ด ๋์ด์์ง ์์ผ๋ ์์ฒ๋ผ ์์ฑ์ ํด์ผ ํ๋ค. ์ด๋, ๋ณธ๋์๋ ๋ฆฌํด ๊ฐ์ด List์์ง๋ง boardRepository.findAll์ pageable์ ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฆฌํด ๊ฐ์ Page๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ณธ๋ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ๋ ์ฟผ๋ฆฌ๋ฌธ๋ ์์ฑ์ ํด์ผ ํ๊ณ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ํด๋์ค๋ ๋ฐ๋ก ์์ฑ์ ํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ JPA์ JPA์ findAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ pageable ํด๋์ค๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค๋ฉด ๋ณต์กํ ์ฒ๋ฆฌ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํ์ด์ง ๋ธ๋ก ์ถ๋ ฅํ๊ธฐ
ํ์ํ ๋ณ์
์ฌ์ฉํ Thymeleaf ๋ฌธ๋ฒ
ํ์ด์ง ๋ธ๋ญ ์ฒ๋ฆฌ ํ BoardController/boardList
@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
Page<Board> list = null;
if (searchKeyword == null) {
list = boardService.boardList(pageable);
} else {
list = boardService.boardSearchList(searchKeyword, pageable);
}
int nowPage = list.getPageable().getPageNumber() + 1;
int startPage = Math.max(nowPage - 4, 1); //Math.max๋ฅผ ์ด์ฉํด์ start ํ์ด์ง๊ฐ 0์ดํ๋ก ๋๋ ๊ฒ์ ๋ฐฉ์ง
int endPage = Math.min(nowPage + 5, list.getTotalPages()); //endPage๊ฐ ์ด ํ์ด์ง์ ๊ฐ์๋ฅผ ๋์ง ์๋๋ก
model.addAttribute("list", list);
model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
return "boardList";
}
์ฝ๋ ์ค๋ช
getPageable().getPageNumber()
int startPage = Math.max(nowPage - 4, 1)
int endPage = Math.min(nowPage + 5, list.getTotalPages());
list.getTotalPages()
: ์ด ํ์ด์ง์ ์ ๋ถ๋ฌ์ค๊ธฐ model.addAttribute("nowPage", nowPage);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", 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>
html์ ์์ ํ์ด์ง ์ฝ๋๋ ์ถ๊ฐ๋ฅผ ํ๋ค. ์ด์ ํ์ธ์ ํด๋ณด์.
ํ์ด์ง ์ฒ๋ฆฌ ํ ๊ฒ์๊ธ ๋ฆฌ์คํธ ํ๋ฉด
๋๋ ํ ํ์ด์ง์ 9๊ฐ์ ๊ฒ์๊ธ์ด ๋ณด์ด๋๋ก ์ค์ ์ ํ๋ค. ๋ํ, ๋ณ๋์ style ์ฝ๋๋ฅผ ์ถ๊ฐํด์ ํ์ฌ ํ์ด์ง๋ ๋นจ๊ฐ์์ผ๋ก ๋ณด์ด๋๋ก ํ๋ค.
์ด์ 2ํ์ด์ง๋ฅผ ํด๋ฆญํด์ ํ์ด์ง ์ฒ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์ ์ฉ์ด ๋๋์ง ํ์ธ์ ํด๋ณด์.
2ํ์ด์ง๋ก ์ด๋ํ ๊ฒ์๊ธ ๋ฆฌ์คํธ ํ๋ฉด
2ํ์ด์ง๋ฅผ ํด๋ฆญํ๋๋ ์ ์์ ์ผ๋ก 2ํ์ด์ง๋ก ๋์ด์จ ๊ฒ์ ์ ์ ์๋ค.
๋ค์ ๊ธ์ ๊ฒ์ ๊ธฐ๋ฅ์ ๋ํด์ ์์ฑํ๊ฒ ์ต๋๋ค. ๊ธ์์ ๋ถ์กฑํ ๋ถ๋ถ์ด ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ์ง์ ์ ํ์ํฉ๋๋ค!!
๋ ์์ธํ ์ฝ๋๋ ๊นํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๊นํ๋ธ: https://github.com/pp8817/ToyProjectBoard