Spring Boot/STUDY

[Spring Boot] JPA 프로젝트 - @Query를 사용한 검색 기능 구현(2)

코맹 2024. 6. 25. 11:15

 

단순 select문이 아닌 복잡한 쿼리문을 사용하기 위해 @Query 어노테이션을 통해 쿼리를 작성해보겠다.

 

@Query 어노테이션으로 직접 쿼리를 작성
- 단순 쿼리가 아니라서 JpaRepository가 자동으로 만들어줄 수 없을 때 사용
- DB의 표준쿼리와 차이가 있음(Java Entity와 일치)

 

 

/repository/BoardRepository.java, findAllByKeyword() 메서드 추가
@Query("select distinct b " +
           " from Board b " +
           " left join Reply r on r.board = b " + 
           " where b.title like %:kw% " + 
           " or b.content like %:kw% " + 
           " or r.content like %:kw% ")
    Page<Board> findAllByKeyword(@Param("kw") String kw, Pageable pageable);
  • 위의 메서드들은 entity가 존재했기 때문에 동작을 했으나, keyword의 경우 entity에 존재하지 않기 때문에 @Query 어노테이션을 붙여줘야 함

 

/service/BoardService.java  getList() 메서드 return 부분 수정

public Page<Board> getList(int page, String keyword) {
    List<Sort.Order> sorts = new ArrayList<>();
    sorts.add(Sort.Order.desc("createDate"));
    Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));   // pageSize를 동적으로도 변경할 수 있음. 나중에...
    
    // Specification<Board> spec = searchBoard(keyword);
    // return this.boardRepository.findAll(spec, pageable);
    return this.boardRepository.findAllByKeyword(keyword, pageable);

  }
  • 금방 BoardRepository.java에서 만든findAllByKeyword()를 사용

 

  • Specification을 사용해서 검색기능을 구현한 것과 동일한 결과가 나옴