키워드 검색 등 커스텀하여 검색하려면 쿼리의 네임메서드만으로는 부족하여 @Query 어노테이션을 이용해 커스텀한 검색기능 구현을 했다.
PostsRepository
public interface PostsRepository extends JpaRepository<Posts,Long> {
Optional<Posts> findByIdAndUserId(Long id, Long userId);
@Query(
value = "SELECT p FROM Posts p WHERE p.title LIKE %:title% OR p.content LIKE %:content%"
)
Page<Posts> findAllSearch(String title,String content,Pageable pageChoice);
}
파라미터 바인딩
UserController
//title or content 검색기능 ,페이징
@GetMapping("/keyword")
public List<PostsResponse> searchByKeyword(@RequestParam String title, @RequestParam String content ,@RequestParam int pageChoice){
return userService.searchByKeyword(title,content,pageChoice);
}
@RequestParam 을 이용해 title,content,pageChoice(원하는페이지번호) 를 url 로 입력값을 받아 서버로 보낸다.
UserService
private Pageable pageableSetting(int pageChoice) {
Sort.Direction direction = Sort.Direction.DESC;
Sort sort = Sort.by(direction, "id");
Pageable pageable = PageRequest.of(pageChoice - 1, 4, sort);
return pageable;
}
public List<PostsResponse> searchByKeyword(String title, String content, int pageChoice) {
Page<Posts> postsListPage = postsRepository.findAllSearch(title, content, pageableSetting(pageChoice));
List<PostsResponse> postsResponseList = postsListPage.stream().map(PostsResponse::new).collect(Collectors.toList());
return postsResponseList;
}
pageableSetting()메서드를 만들어서 페이징처리 좀 더 쉽고, 가독성있게 구현하고 싶어 메서드를 생성하여 페이징 처리를 했다.
그리고 처음에 만들어둔 postRepository 에 만들어둔 @Query~ 쿼리를 통해 입력값과 동일 또는 포함하는 게시글을 조회 되도록 구현했다.