본문 바로가기
Spring

[TIL] 240123 최종 프로젝트: 키워드 기반 상품 검색

by studymode 2024. 1. 23.

상품 검색

전체 상품의 이름과 상품 설명 중 사용자가 입력한 문자열이 있으면 다 반환한다.

 

 

상품검색 

 * 키워드를 기반으로 상품을 검색합니다. 페이지네이션과 정렬 기능을 제공합니다.
 * @param keyword  검색할 키워드
 * @param pageable 페이지네이션 정보
 * @return 검색 결과와 상태 정보를 담은 ApiResponse

 

ProductService

// 상품 검색
public Page<ProductResponseDto> getProductsBySearch(String keyword, Pageable pageable) {
  if (!StringUtils.hasText(keyword)) {
    throw new ApiException("검색어를 입력해주세요.", HttpStatus.BAD_REQUEST);
  }

  Page<Product> products = productRepository.findByKeyword(keyword, pageable);
  return products.map(ProductResponseDto::new);
}

 

 

ProductRespository

@Query("SELECT p FROM Product p WHERE p.name LIKE %:keyword% OR p.description LIKE %:keyword%")
Page<Product> findByKeyword(@Param("keyword") String keyword, Pageable pageable);

 

Spring Data JPA의 메서드에 사용되는 @Query 어노테이션을 사용하여

JPQL(Java Persistence Query Language) 쿼리 정의

주어진 keyword를 포함하는 제품을 검색

  • 엔터티: Product
  • 필드: name, description
  • SELECT p: 엔터티를 선택 (Product 엔터티)
  • FROM Product p: Product 엔터티를 사용하여 검색 대상 테이블을 지정. p는 엔터티에 대한 별칭(alias)
  • WHERE p.name LIKE %:keyword% OR p.description LIKE %:keyword%: 검색 조건을 정의.
    • 제품의 이름(name) 또는 설명(description)이 주어진 keyword를 포함하는지 여부를 확인
    • LIKE는 부분 일치를 나타내며, %:keyword%는 주어진 keyword가 문자열의 어느 부분에든 포함된 경우를 찾음
  • Page<Product>은 페이징된 결과를 반환하기 위한 형식.
  • Pageable pageable 매개변수는 페이징 및 정렬을 위한 정보를 전달하는 데 사용.
  • 해당 쿼리는 keyword를 포함하는 제품을 페이지로 나눠 검색하고 반환합니다.