๐Ÿ’ก ๊ฒŒ์‹œํŒ - ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

๋ฐ•์ƒ๋ฏผยท2023๋…„ 9์›” 7์ผ
0

๋‚˜์˜ ์ž‘์€ ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
3/10


์œ„๋Š” ํ˜„์žฌ์˜ ๊ฒŒ์‹œํŒ ์ƒํ™ฉ์ด๋‹ค. ์ด์ „ ์ž‘์„ฑ์‹œ๊ฐ„ ์ถ”๊ฐ€ ๊ธ€๊ณผ ๋‹ฌ๋ฆฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ๊ฒ€์ƒ‰ ๋ถ€๋ถ„์ด ์ƒ๊ธด ๊ฒƒ์ด ๋ณด์ธ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์— ๊ด€ํ•ด์„œ ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค.

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 = )

  • page: default ํŽ˜์ด์ง€ ์ง€์ •
  • size: ํ•œ ํŽ˜์ด์ง€์— ๋ณด์—ฌ์ค„ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜ ์ง€์ •
  • sort: ์ •๋ ฌ ๊ธฐ์ค€ ์ง€์ •
    • direction: ์ •๋ ฌ ์ˆœ์„œ ์ง€์ •
      • Sort.Direction.DESC: ์ •๋ ฌ ๊ธฐ์ค€์˜ ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ

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 ํด๋ž˜์Šค๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋œ๋‹ค๋ฉด ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŽ˜์ด์ง€ ๋ธ”๋Ÿญ ์ถœ๋ ฅํ•˜๊ธฐ

ํŽ˜์ด์ง€ ๋ธ”๋ก ์ถœ๋ ฅํ•˜๊ธฐ
ํ•„์š”ํ•œ ๋ณ€์ˆ˜

  • nowPage: ํ˜„์žฌ ํŽ˜์ด์ง€
  • startPage: ๋ธ”๋Ÿญ์—์„œ ๋ณด์—ฌ์ค„ ์‹œ์ž‘ ํŽ˜์ด์ง€ ํŽ˜์ด์ง€
  • endPage: ๋ธ”๋Ÿญ์—์„œ ๋ณด์—ฌ์ค„ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€

์‚ฌ์šฉํ•  Thymeleaf ๋ฌธ๋ฒ•

  • th:text: ํƒœ๊ทธ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
  • th:each: ๋ฐ˜๋ณต๋ฌธ
  • th:each="${number:#number(์‹œ์ž‘๋ฒˆํ˜ธ, ๋๋ฒˆํ˜ธ)}" : ์‹œ์ž‘ ๋ฒˆํ˜ธ์—์„œ ๋ ๋ฒˆํ˜ธ๊นŒ์ง€ ๋ฐ˜๋ณต

ํŽ˜์ด์ง€ ๋ธ”๋Ÿญ ์ฒ˜๋ฆฌ ํ›„ 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)

    • Math.max๋ฅผ ์ด์šฉํ•ด์„œ startPage๊ฐ€ 0์ดํ•˜๋กœ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • int endPage = Math.min(nowPage + 5, list.getTotalPages());

    • Math.min์„ ์ด์šฉํ•ด์„œ endPage๊ฐ€ ์ด ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๋„˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
    • 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

profile
์Šคํ”„๋ง ๋ฐฑ์—”๋“œ๋ฅผ ๊ณต๋ถ€์ค‘์ธ ๋Œ€ํ•™์ƒ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€