상품 검색
전체 상품의 이름과 상품 설명 중 사용자가 입력한 문자열이 있으면 다 반환한다.
상품검색
* 키워드를 기반으로 상품을 검색합니다. 페이지네이션과 정렬 기능을 제공합니다.
* @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를 포함하는 제품을 페이지로 나눠 검색하고 반환합니다.
'Spring' 카테고리의 다른 글
[TIL] 230201 N+1 문제 해결 Join fetch, BatchSize (0) | 2024.02.01 |
---|---|
[TIL] 240125 Spring @Transactional (0) | 2024.01.25 |
[TIL] 240119 AWS EC2 (0) | 2024.01.19 |
[기술면접] 240118 OAuth, 클래스형과 함수형의 차이 (0) | 2024.01.18 |
[TIL] 240110 Spring 사진 파일 저장 MultipartFile (0) | 2024.01.10 |