findBy(μ»¬λΌ μ΄λ¦)
findBy(μ»¬λΌ μ΄λ¦)Containing : μ€λ μ¬μ©ν κΈ°λ₯
RoardRepository
@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> {
Page<Board> findByTitleContaining(String searchKeyword, Pageable pageable);
}
μ°μ JpaRepositoryμ κ²μ κΈ°λ₯μ μ¬μ©νκΈ° μν΄μ BoardRepositoryμ λμλ¬Έμλ₯Ό μ μν΄μ Page<Board> findByTitleContaining(String searchKeyword, Pageable);
λ₯Ό μΆκ°ν΄μ€λλ€. μ΄λ Pageableμ λ°λ μ΄μ λ κ²μ κ²°κ³Ό λν νμ΄μ§ μ²λ¦¬λ₯Ό ν΄μ€μΌνκΈ° λλ¬Έμ
λλ€.
λν κΈ°μ‘΄μ BoardServiceμλ κ²μ κΈ°λ₯μ΄ μκΈ° λλ¬Έμ ν΄λΉ λ©μλλ₯Ό λ§λ€μ΄μ€λλ€.
BoardService
public Page<Board> boardSearchList(String searchKeyword, Pageable pageable) {
return boardRepository.findByTitleContaining(searchKeyword, pageable);
}
μ μ²λΌ boardSearchList λ©μλλ₯Ό λ§λ€μ΄μ£Όλλ° κ²μνλ λ΄μ©λ νμ΄μ§ μ²λ¦¬λ₯Ό ν΄μ€μΌνκΈ° λλ¬Έμ Pageableλ λ°μμ€λλ€. λ©μλμμ λ°μ searchKeyword
μ pageable
μ μ΄μ μ μμ±ν΄λ boardRepository.findByTitleContaining
μ λ겨μ€λλ€.
μ΄μ 컨νΈλ‘€λ¬λ‘ κ°μ 컨νΈλ‘€λ¬λ₯Ό μμ ν΄μ£Όκ² μ΅λλ€.
BoardController - κΈ°μ‘΄ μ½λ
@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
Page<Board> list = boardService.boardList(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";
}
κΈ°μ‘΄ μ½λλ νμ΄μ§ μ²λ¦¬ κΈ°λ₯μ΄ μΆκ°λ μ½λλ‘ λͺ¨λ λ°μ΄ν°λ₯Ό κ°μ Έμμμ΅λλ€. νμ§λ§ κ²μ κΈ°λ₯μ΄ μΆκ°λλ€λ©΄ κ²μ νμ λμ κ²μνμ§ μμμ λ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λ°©μμ ꡬλ³μ λ¬μΌν©λλ€.
BoardController - λ³κ²½ ν μ½λ
@GetMapping("/board/list")
public String boardListForm(Model model, @PageableDefault(page = 0, size = 9, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable, String searchKeyword) {
Page<Board> list = null;
if (searchKeyword == null) { // κ²μX
// κΈ°μ‘΄κ³Ό λμΌνκ² λͺ¨λ λ°μ΄ν° λΆλ¬μ€κΈ°
list = boardService.boardList(pageable);
} else { // κ²μ O
// κ²μν λ°μ΄ν°λ§ κ°μ Έμ€κΈ°
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";
}
μ°μ 맀κ°λ³μλ‘ String searchKeyword
λ₯Ό λ°μμ€λλ€.
κ²μμ νμ§ μμ κ²½μ° - searchKeyword==null
boardService.boardList(pageable)
-> BoardRepositoryμ findAll λ©μλ μ€νκ²μμ ν κ²½μ° - searchKeyword!=null
boardService.boardSearchList(searchKeyword, pageable)
-> BoardRepositoryμ findByTitleContaining λ©μλ μ€νκΈ°λ₯ λ‘μ§μ μ΄λμ λ λμμΌλ μ΄μ html λΆλΆμ μμ ν΄μ κ²μμ°½μ λ§λ€μ΄μ£Όκ² μ΅λλ€.
boardList.html
<!-- νμ΄μ§ λΆλΆ -->
<div class="pagination">
<th:block th:each="page : ${#numbers.sequence(startPage, endPage)}">
<a th:if="${page != nowPage}" th:href="@{/board/list(page=${page - 1}, searchKeyword=${param.searchKeyword})}" th:text="${page}" class="page-link"></a>
<strong th:if="${page == nowPage}" th:text="${page}" class="current-page"></strong>
</th:block>
</div>
κ²μκΈ λ¦¬μ€νΈ νμ΄μ§μ νμ΄μ§ λΆλΆ html μ½λμ
λλ€. κΈ°μ‘΄ μ½λμμ searchKeyword=${param.searchKeyword}
κ° μΆκ°λμμ΅λλ€. μ΄λ κ²μ ν νμ΄μ§λ₯Ό λ³κ²½ν΄λ κ²μ κ²°κ³Όκ° μ μ§λλ κΈ°λ₯μ ν©λλ€.
λ§μ½ μ΄ μ½λκ° μλ€λ©΄ κ²μ ν νμ΄μ§λ₯Ό λ³κ²½νλ©΄ κ²μ κ²°κ³Όκ° μμ΄μ§λ λ¬Έμ κ° λ°μν©λλ€.
κ²μ input, button html
<form th:action="@{/board/list}" method="get">
<div class="search-container">
<label class="search-label" for="searchKeyword">κ²μμ΄:</label>
<input class="search-input" type="text" id="searchKeyword" name="searchKeyword" />
<button class="search-button" type="submit">κ²μ</button>
</div>
</form>
μμ± ν κ²μκΈ λ¦¬μ€νΈ νμ΄μ§
GPTλ₯Ό μ΄μ©ν΄μ λμμΈμ ν κ²μκΈ λ¦¬μ€νΈ νμ΄μ§μ
λλ€. htmlμ μΆκ°ν κ²μ²λΌ κ²μμ°½μ΄ μΆκ°λμμ΅λλ€. μ΄μ κΈ°λ₯μ΄ μ λμνλμ§ νμΈν΄λ³΄κ² μ΅λλ€.
μμ κ²μ κ²°κ³Ό
κ²μ μ°½μ 'μμ 'μ κ²μν κ²°κ³Όμ
λλ€. 'μμ 'μ΄ λ€μ΄κ° λͺ¨λ κ²μκΈμ΄ μ μμ μΌλ‘ κ²μμ΄ λ κ²μ μ μ μμ΅λλ€.
λ€μ κΈμ νμΌ μ λ‘λμ λν΄μ μμ±νκ² μ΅λλ€. κΈμμ λΆμ‘±ν λΆλΆμ΄ λ§μ κ² κ°μ΅λλ€. λͺ¨λ μ§μ μ νμν©λλ€!!
λ μμΈν μ½λλ κΉνλΈλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!
κΉνλΈ: https://github.com/pp8817/ToyProjectBoard