- 간단하게 게시글 검색 기능을 구현해보았습니다. 사실 작성자, 제목, 내용을 선택하여 검색할 수 있도록 구현해보려고 하였으나 기존에 작성해놓은 코드를 바탕으로 수정하며 작성하다보니 구현하는게 꽤 복잡하여, 포기하고 글 제목을 기준으로만 검색할 수 있도록 구현하였습니다. 나중에 기회가 된다면 최소한 작성자를 기준으로 검색하는 기능까지는 추가해보려고 합니다.
📝 BoardRepository
- 우선 사용자가 작성한 키워드를 전달받아 DB에서 데이터를 뽑아올 수 있도록 아래와 같은 코드를 작성해주었습니다.
package com.cos.blog.repository;
...
// @Repository
public interface BoardRepository extends JpaRepository<Board, Long>{
...
Page<Board> findByTitleContaining(String searchKeyword, Pageable pageable);
}
- 해당 코드는 파라미터로 받은
searchKeyword
를 기준으로 DB에서 데이터를 찾아 반환하는 역할을 수행합니다. 메서드 뒤에Containing
을 붙여주어 해당 키워드가 포함되는 모든 게시글을 뽑아낼 수 있도록 하였습니다.
📝 BoardController
- 다음으로 Controller에서는 사용자가 키워드를 전달하였는지 여부를 판단하고 분기하여 게시글을 출력하도록 하였습니다.
@GetMapping("/")
public String index(Model model,
@PageableDefault(size = 3, sort = "id", direction = Sort.Direction.DESC) Pageable pageable,
@RequestParam(value = "searchKeyword", required = false) String searchKeyword) {
if(searchKeyword == null)
model.addAttribute("boards", boardRepository.findAll(pageable));
else {
model.addAttribute("boards", boardRepository.findByTitleContaining(searchKeyword, pageable));
}
return "index";
}
📝 index.jsp
- 마지막으로 View 단의 코드를 아래와 같이 추가 및 수정해주었습니다.
...
<div class="container">
<form action="/" method="GET" class="form-inline p-2 bd-highlight">
<div>
<input type="text" name="searchKeyword" class="form-control" placeholder="검색">
<button type="submit" class="btn btn-primary">Search</button>
</div>
</form>
...
<br>
<ul class="pagination justify-content-center">
<c:choose>
<c:when test="${boards.first}">
<li class="page-item disabled"><a class="page-link" href="?page=${boards.number - 1}">Prev</a></li>
</c:when>
<c:otherwise>
<li class="page-item"><a class="page-link" href="?page=${boards.number - 1}&searchKeyword=${param.searchKeyword}">Prev</a></li>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${boards.last}">
<li class="page-item disabled"><a class="page-link" href="?page=${boards.number + 1}">Next</a></li>
</c:when>
<c:otherwise>
<li class="page-item"><a class="page-link" href="?page=${boards.number + 1}&searchKeyword=${param.searchKeyword}">Next</a></li>
</c:otherwise>
</c:choose>
</ul>
</div>
<br>
...
- 위와 같이 페이징을 할 때 쿼리스트링으로
searchKeyword
를 함께 전달해주어야 필터가 적용된 검색 결과에 대한 페이징을 수행할 수 있습니다.
💡 알게 된 점
- 데이터베이스에서 키워드에 따라 데이터를 뽑아오는 과정
- 이를 View에 렌더링 하는 경험을 해보았습니다.
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 30. 게시판 정렬 기능 구현 (0) | 2022.09.03 |
---|---|
[스프링부트 게시판] 29. 추천 기능 구현 (1) | 2022.09.01 |
[스프링부트 게시판] 27. 게시글 작성일 및 조회수 추가 (0) | 2022.07.03 |
[스프링부트 게시판] 26. 커스텀 Validation을 통한 중복 검사 구현 (0) | 2022.07.02 |
[스프링부트 게시판] 25. 회원가입시 validation 체크 (0) | 2022.06.30 |