/** λ©μΈ νμ΄μ§ */
@GetMapping("/")
public ResponseEntity<List<List<?>>> mainPage(){
List<List<?>> returnList = productService.mainPageProductList();
return (!returnList.isEmpty()) ?
ResponseEntity.status(HttpStatus.OK).body(returnList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
/** μνλͺ
μΌλ‘ κ²μ */
@GetMapping("/shop/search/{keyword}")
public ResponseEntity<List<ResponseProductSummary>> findByProductName(@PathVariable String keyword, @RequestParam(value = "sort", defaultValue = "hits") String sort){
List<ResponseProductSummary> productList = productService.findByProductName(keyword, sort);
return (!productList.isEmpty()) ?
ResponseEntity.status(HttpStatus.OK).body(productList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
/** μν μ 체 μ‘°ν */
@GetMapping("/shop")
public ResponseEntity<List<ResponseProductSummary>> findAllProduct(@RequestParam(value = "sort", defaultValue = "hits") String sort){
List<ResponseProductSummary> productList = productService.findAllProduct(sort);
return (!productList.isEmpty()) ?
ResponseEntity.status(HttpStatus.OK).body(productList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
/** μν μΉ΄ν
κ³ λ¦¬λ³ μ‘°ν */
@GetMapping("/shop/category/{category}")
public ResponseEntity<List<ResponseProductSummary>> findByCategory(@PathVariable String category, @RequestParam(value = "sort", defaultValue = "hits") String sort){
List<ResponseProductSummary>productList = productService.findByCategory(category, sort);
return (!productList.isEmpty()) ?
ResponseEntity.status(HttpStatus.OK).body(productList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
/** μν μμΈ νμ΄μ§ μ‘°ν */
@Transactional
@GetMapping("/shop/detail/{id}")
public ResponseEntity<ResponseProduct> findById(@PathVariable Long id){
productService.increaseHits(id);
ResponseProduct product = productService.findById(id);
return (product != null) ?
ResponseEntity.status(HttpStatus.OK).body(product) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
/** νλ§€λ±λ‘ν μν λͺ©λ‘ μ‘°ν */
@GetMapping("/register/product")
public ResponseEntity<List<ResponseProductSummary>> findProductByUsername(HttpServletRequest request){
User user = (User) request.getAttribute("user");
List<ResponseProductSummary> productList = productService.findProductByUsername(user.getId());
return (!productList.isEmpty()) ?
ResponseEntity.status(HttpStatus.OK).body(productList) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
ProductServiceμ κ° μ‘°νμ λ§λ ν¨μλ₯Ό νΈμΆνκ³ κ²°κ³Όμ λ°λΌ 200 λλ 400μ status codeλ₯Ό λ°ν
μνλͺ μΌλ‘ κ²μ, μν μ 체 μ‘°ν, μν μΉ΄ν κ³ λ¦¬λ³ μ‘°νλ μνλ sort λ°©μμΌλ‘ μ¬μ© κ°λ₯
@Override
public List<List<?>> mainPageProductList() {
List<Product> productList = productRepository.findTop8ByOrderByIdDesc();
List<Banner> bannerList = bannerRepository.findAll();
return entityToDtoMainPageList(productList, bannerList);
}
@Override
public List<ResponseProductSummary> findByProductName(String keyword, String sort) {
List<Product> productList = new ArrayList<>();
switch (sort) {
case "hits" -> productList = productRepository.findByNameContainingAndStockGreaterThanOrderByHitsDesc(keyword, 0);
case "date" -> productList = productRepository.findByNameContainingAndStockGreaterThanOrderByDateDesc(keyword, 0);
case "favorite"-> productList = productRepository.findByNameContainingAndStockGreaterThanOrderByFavoriteDesc(keyword, 0);
case "purchase" -> {
return purchaseSort(productRepository.findSearchProductPurchase(keyword));
}
}
return entityToDtoResponseProductSummary(productList);
}
@Override
public List<ResponseProductSummary> findAllProduct(String sort) {
List<Product> productList = new ArrayList<>();
switch (sort) {
case "hits" -> productList = productRepository.findByStockGreaterThanOrderByHitsDesc(0);
case "date" -> productList = productRepository.findByStockGreaterThanOrderByDateDesc(0);
case "favorite"-> productList = productRepository.findByStockGreaterThanOrderByFavoriteDesc(0);
case "purchase" -> {
return purchaseSort(productRepository.findAllProductPurchase());
}
}
return entityToDtoResponseProductSummary(productList);
}
@Override
public List<ResponseProductSummary> findByCategory(String category, String sort) {
List<Product> productList = new ArrayList<>();
switch (sort) {
case "hits" -> productList = productRepository.findByCategoryAndStockGreaterThanOrderByHitsDesc(category, 0);
case "date" -> productList = productRepository.findByCategoryAndStockGreaterThanOrderByDateDesc(category, 0);
case "favorite"-> productList = productRepository.findByCategoryAndStockGreaterThanOrderByFavoriteDesc(category, 0);
case "purchase" -> {
return purchaseSort(productRepository.findCategoryProductPurchase(category));
}
}
return entityToDtoResponseProductSummary(productList);
}
@Override
public ResponseProductDetails findById(User user, Long id) {
Product product = productRepository.findById(id).orElse(null);
if (product == null){
return null;
}
Boolean status = false;
if(user != null) {
status = favoriteRepository.existUserProductByFavorite(user.getId(), id);
}
return ResponseProductDetails.builder().product(product).status(status).build();
}
@Override
public List<ResponseProductSummary> findProductByUsername(Long userId) {
List<Product> productList = productRepository.findByUserId(userId);
return entityToDtoResponseProductSummary(productList);
}
/** Entity to Dto */
public List<ResponseProductSummary> entityToDtoResponseProductSummary(List<Product> productList) {
List<ResponseProductSummary> responseProductList = new ArrayList<>();
if (!productList.isEmpty()){
for(Product product : productList){
responseProductList.add(ResponseProductSummary.builder().product(product).build());
}
}
return responseProductList;
}
public List<ResponseProductSummary> purchaseSort(List<ResponseProductPurchase> productPurchaseList) {
Collections.sort(productPurchaseList);
return productPurchaseList.stream().map(productPurchase -> ResponseProductSummary
.dtoBuilder()
.responseProductPurchase(productPurchase)
.dtoBuild()).toList();
}
/** Entity to Dto */
public List<List<?>> entityToDtoMainPageList(List<Product> productList, List<Banner> bannerList) {
List<ResponseProductMain> responseProductList = new ArrayList<>();
List<ResponseBanner> responseBannerList = new ArrayList<>();
List<List<?>> returnList = new ArrayList<>();
if (!productList.isEmpty() && !bannerList.isEmpty()) {
for(Product product : productList){
responseProductList.add(ResponseProductMain.builder().product(product).build());
}
for (Banner banner : bannerList) {
responseBannerList.add(ResponseBanner.builder().banner(banner).build());
}
returnList.add(responseProductList);
returnList.add(responseBannerList);
}
return returnList;
}
κ° μνλ 쑰건μ 컨νΈλ‘€λ¬μμ λ°μμ μ μ ν 쿼리λ₯Ό μν
λ©μΈ νμ΄μ§λ μνκ³Ό λ² λλ₯Ό κ°μ΄ μ λ¬, entityToDtoMainPageList ν¨μλ₯Ό μ¬μ©ν΄ Entity to Dto μν
λ€λ₯Έ λͺ¨λ μ‘°νλ Product λΌλ Entityλ§μ μ‘°ννλ―λ‘ λ©μΈ νμ΄μ§μλ λ€λ₯Έ entityToDtoResponseProductSummary ν¨μλ‘ Entity to Dto μν
ꡬ맀 μ μ λ ¬μ 쿼리 νΉμ± μ WAS λ¨μμ μ λ ¬ λ‘μ§ μν
/**λ©μΈ νμ΄μ§ μν μ‘°ν*/
List<Product> findTop8ByOrderByIdDesc();
// =================================================================
/**μνλͺ
μΌλ‘ κ²μ μ‘°νμλμμμΌλ‘ μ‘°ν*/
List<Product> findByNameContainingAndStockGreaterThanOrderByHitsDesc(String name, int stock);
/**μνλͺ
μΌλ‘ κ²μ μ΅μ μμΌλ‘ μ‘°ν*/
List<Product> findByNameContainingAndStockGreaterThanOrderByDateDesc(String name, int stock);
/**μνλͺ
μΌλ‘ κ²μ μ’μμμμΌλ‘ μ‘°ν*/
List<Product> findByNameContainingAndStockGreaterThanOrderByFavoriteDesc(String name, int stock);
// =================================================================
/**μν μ 체 μ‘°νμλμμμΌλ‘ μ‘°ν*/
List<Product> findByStockGreaterThanOrderByHitsDesc(int stock);
/**μν μ 체 μ΅μ μμΌλ‘ μ‘°ν*/
List<Product> findByStockGreaterThanOrderByDateDesc(int stock);
/**μν μ 체 μ’μμμμΌλ‘ μ‘°ν*/
List<Product> findByStockGreaterThanOrderByFavoriteDesc(int stock);
// =================================================================
/**μν μΉ΄ν
κ³ λ¦¬λ³ μ‘°νμλμμμΌλ‘ μ‘°ν*/
List<Product> findByCategoryAndStockGreaterThanOrderByHitsDesc(String category, int stock);
/**μν μΉ΄ν
κ³ λ¦¬λ³ μ΅μ μμΌλ‘ μ‘°ν*/
List<Product> findByCategoryAndStockGreaterThanOrderByDateDesc(String category, int stock);
/**μν μΉ΄ν
κ³ λ¦¬λ³ μ’μμμμΌλ‘ μ‘°ν*/
List<Product> findByCategoryAndStockGreaterThanOrderByFavoriteDesc(String category, int stock);
// =================================================================
/**νλ§€λ±λ‘ν μν λͺ©λ‘ μ‘°ν*/
List<Product> findByUserId(Long userId);
μ λ ¬ 쿼리λ μ‘°ν μ, κ²μ μ, μ’μμ μμ JPA κΈ°λ³Έ λ¬Έλ² μ¬μ©
@Override
public List<ResponseProductPurchase> findAllProductPurchase() {
return queryFactory.select(Projections.fields(ResponseProductPurchase.class,
product.id,
product.name,
product.price,
product.favorite,
product.imgKey,
ExpressionUtils.as(
JPAExpressions.select(orderProduct.count.sum())
.from(orderProduct)
.groupBy(orderProduct.product.id)
.orderBy(OrderByNull.DEFAULT)
.where(orderProduct.product.eq(product)), "count"
)))
.from(product)
.where(product.stock.gt(0))
.fetch();
}
@Override
public List<ResponseProductPurchase> findSearchProductPurchase(String keyword) {
BooleanExpression status = null;
status = containKeyword(keyword);
if (status == null) {
return null;
}
return queryFactory.select(Projections.fields(ResponseProductPurchase.class,
product.id,
product.name,
product.price,
product.favorite,
product.imgKey,
ExpressionUtils.as(
JPAExpressions.select(orderProduct.count.sum())
.from(orderProduct)
.groupBy(orderProduct.product.id)
.orderBy(OrderByNull.DEFAULT)
.where(orderProduct.product.eq(product)), "count"
)))
.from(product)
.where(status,product.stock.gt(0))
.fetch();
}
@Override
public List<ResponseProductPurchase> findCategoryProductPurchase(String category) {
BooleanExpression status = null;
status = eqCategory(category);
if (status == null) {
return null;
}
return queryFactory.select(Projections.fields(ResponseProductPurchase.class,
product.id,
product.name,
product.price,
product.favorite,
product.imgKey,
ExpressionUtils.as(
JPAExpressions.select(orderProduct.count.sum())
.from(orderProduct)
.groupBy(orderProduct.product.id)
.orderBy(OrderByNull.DEFAULT)
.where(orderProduct.product.eq(product)), "count"
)))
.from(product)
.where(status,product.stock.gt(0))
.fetch();
}
ꡬ맀 μμ μλΈ μΏΌλ¦¬λ‘ OrderProductμ countκ°μ product_idλ₯Ό κΈ°μ€μΌλ‘ GroupByλ‘ κ°μ Έμμ μ§ν
μ΅μ’ 쿼리μμ stockμ΄ 0μ΄λΌλ©΄ μ¬κ³ κ° μλ€λ λ»μ΄κΈ° λλ¬Έμ 0 μ΄κ³ΌμΌ λλ§ μ‘°ν