[Spring] @Query 이용한 검색기능 및 페이징 구현

hyewon jeong·2023년 1월 19일
0

Spring

목록 보기
23/59

키워드 검색 등 커스텀하여 검색하려면 쿼리의 네임메서드만으로는 부족하여 @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~ 쿼리를 통해 입력값과 동일 또는 포함하는 게시글을 조회 되도록 구현했다.


참고 [[Spring Data JPA] 쿼리 메서드와 @Query를 이용한 사용자 정의 쿼리](https://velog.io/@wonizizi99/Spring-Data-JPA-%EC%BF%BC%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C%EC%99%80-Query%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%BF%BC%EB%A6%AC)

https://semtax.tistory.com/78

profile
개발자꿈나무

0개의 댓글