검색 단어가 포함된 데이터 조회

Do_It·2023년 10월 24일

SQL에서 %를 사용하면 해당 위치에 어떤 문자열이든 올 수 있다는 것을 착안하여
검색단어가 포함된 데이터 조회 API를 만들었다.

방법!
1. 쿼리스트링으로 검색할 단어를 받는다.
2. String 검색단어 = %쿼리스트링으로받은검색단어%
3. Repository에서 검색단어를 활용하여 쿼리문을 작성한다.

  1. 쿼리 스트링으로 검색 단어 받기
@ApiOperation(value = "상품 검색")
    @GetMapping("/search") //  ?pageNumber=1&searchWord=반바지
    public ResponseEntity<List<GetProductDto>> searchProduct(
            @RequestParam(name = "pageNumber", required = false, defaultValue = "1") Integer pageNumber,
            @RequestParam(name = "searchWord", required = false, defaultValue = "") String searchWord,
            @RequestParam(name = "ageCategory", required = false, defaultValue = "") String ageCategory,
            @RequestParam(name = "genderCategory", required = false, defaultValue = "") String genderCategory,
            @RequestParam(name = "sortBy", required = false, defaultValue = "id") String sortBy
    ){
        return ResponseEntity.ok(productService.searchProducts(pageNumber, searchWord, ageCategory,genderCategory, sortBy));
    }
  1. 쿼리 스트링으로 받은 검색단어에 %를 붙여서 String 변수 만들기
@Transactional(readOnly = true)
    public List<GetProductDto> searchProducts(Integer pageNumber, String searchWord, String ageCategory, String genderCategory, String sortBy) {
        String inputAgeCategory = AgeCategoryEnum.switchCategory(ageCategory);
        String inputGenderCategory = GenderCategoryEnum.switchCategory(genderCategory);
        Pageable pageable = PageRequest.of(pageNumber - 1, 15); //한 페이지 15개
        String searchToken = "%"+searchWord+"%";

        if (Objects.equals(sortBy, "price")) {
            return productRepository.searchProductSortByPrice(searchToken, inputAgeCategory,inputGenderCategory, pageable);
           // return productList.stream().map(ProductDto::fromEntity).collect(Collectors.toList());
        }else if(Objects.equals(sortBy, "createdAt")) {
            return productRepository.searchProductSortByCreatedAt(searchToken,inputAgeCategory,inputGenderCategory, pageable);
           // return productList.stream().map(ProductDto::fromEntity).collect(Collectors.toList());
        }else {
            return productRepository.searchProductSortById(searchToken,inputAgeCategory,inputGenderCategory, pageable);
        }
    }
  1. Repository에 변수를 활용한 쿼리문 작성하기
@Query(value="SELECT NEW com.github.commerce.web.dto.product.GetProductDto(p.id, p.name, p.price,p.createdAt, p.productCategory, p.ageCategory, p.genderCategory, p.leftAmount, p.thumbnailUrl, p.seller.shopName) " +
            "FROM Product p " +
            "WHERE (:inputAgeCategory IS NULL OR p.ageCategory = :inputAgeCategory) " +
            "AND (:inputGenderCategory IS NULL OR p.genderCategory = :inputGenderCategory) " +
            "AND p.isDeleted = false " +
            "AND p.name LIKE :searchToken " +
            "ORDER BY p.price ASC"
    )
    List<GetProductDto> searchProductSortByPrice(
            @Param("searchToken")String searchToken,
            @Param("inputAgeCategory")String inputAgeCategory,
            @Param("inputGenderCategory")String inputGenderCategory,
            @Param("pageable")Pageable pageable
    );
profile
오늘의 노력이 내일의 성장으로 이어지고 있음을

0개의 댓글