diff --git a/src/main/java/com/dailyon/productservice/product/controller/ProductAdminController.java b/src/main/java/com/dailyon/productservice/product/controller/ProductAdminController.java index 5dff4914..370c78ab 100644 --- a/src/main/java/com/dailyon/productservice/product/controller/ProductAdminController.java +++ b/src/main/java/com/dailyon/productservice/product/controller/ProductAdminController.java @@ -44,14 +44,16 @@ ResponseEntity readProductPage( @RequestParam(required = false) Long categoryId, @RequestParam ProductType type, @RequestParam(required = false) String query, - @PageableDefault( - size = 5, - sort = {"updatedAt"}, - direction = Sort.Direction.DESC - ) Pageable pageable + @RequestParam int page, + @RequestParam int size, + @RequestParam String sort, + @RequestParam String direction ) { return ResponseEntity.status(HttpStatus.OK).body( - productFacade.readProductPage(brandId, categoryId, type, query, pageable) + productFacade.readProductPage( + brandId, categoryId, type, query, + page, size, sort, direction + ) ); } diff --git a/src/main/java/com/dailyon/productservice/product/facade/ProductFacade.java b/src/main/java/com/dailyon/productservice/product/facade/ProductFacade.java index da677cbb..4d494920 100644 --- a/src/main/java/com/dailyon/productservice/product/facade/ProductFacade.java +++ b/src/main/java/com/dailyon/productservice/product/facade/ProductFacade.java @@ -91,8 +91,14 @@ public ReadOOTDSearchSliceResponse searchFromOOTD(Long lastId, String query) { return productService.searchFromOOTD(lastId, query); } - public ReadProductPageResponse readProductPage(Long brandId, Long categoryId, ProductType type, String query, Pageable pageable) { - return productService.readProductPage(brandId, categoryId, type, query, pageable); + public ReadProductPageResponse readProductPage( + Long brandId, Long categoryId, ProductType type, String query, + int page, int size, String sort, String direction + ) { + return productService.readProductPage( + brandId, categoryId, type, query, + page, size, sort, direction + ); } @Cacheable(value = "newProducts", unless = "#result == null") diff --git a/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepository.java b/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepository.java index 6c9ce0b3..043522cc 100644 --- a/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepository.java +++ b/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepository.java @@ -17,8 +17,8 @@ Slice findProductSlice( ); Page findProductPage( - Long brandId, List childCategories, - ProductType type, String query, Pageable pageable + Long brandId, List childCategories, ProductType type, String query, + int page, int size, String sort, String direction ); Slice searchProductsFromOOTD(Long lastId, String query); diff --git a/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepositoryImpl.java b/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepositoryImpl.java index bdca108e..2478ab80 100644 --- a/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepositoryImpl.java +++ b/src/main/java/com/dailyon/productservice/product/repository/ProductCustomRepositoryImpl.java @@ -5,10 +5,8 @@ import com.dailyon.productservice.common.enums.ProductType; import com.dailyon.productservice.product.entity.Product; import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.types.Order; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; -import com.querydsl.core.types.dsl.PathBuilder; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -73,10 +71,11 @@ public Slice findProductSlice( @Override public Page findProductPage( - Long brandId, List childCategories, - ProductType type, String query, Pageable pageable + Long brandId, List childCategories, ProductType type, String query, + int page, int size, String sort, String direction ) { - PathBuilder entityPath = new PathBuilder<>(Product.class, "product"); + Pageable pageable = PageRequest.of(page, size); + BooleanBuilder booleanBuilder = new BooleanBuilder(); if(query != null) { booleanBuilder.and(nameContains(query).or(codeContains(query))); @@ -90,14 +89,10 @@ public Page findProductPage( .and(booleanBuilder) .and(productTypeEq(type)) ) + .orderBy(orderSpecifier(sort, direction)) .offset(pageable.getOffset()) .limit(pageable.getPageSize()); - for(Sort.Order order: pageable.getSort()) { - indexQuery.orderBy(new OrderSpecifier( - order.isAscending() ? Order.ASC : Order.DESC, - entityPath.get(order.getProperty()) - )); - } + List indexes = indexQuery.fetch(); if(indexes.isEmpty()) { return new PageImpl<>(new ArrayList<>(), pageable, 0); @@ -111,14 +106,9 @@ public Page findProductPage( .leftJoin(product.describeImages, describeImage).fetchJoin() .leftJoin(product.productStocks, productStock).fetchJoin() .leftJoin(product.reviewAggregate, reviewAggregate).fetchJoin() + .orderBy(orderSpecifier(sort, direction)) .where(product.id.in(indexes)); - for(Sort.Order order: pageable.getSort()) { - resultQuery.orderBy(new OrderSpecifier( - order.isAscending() ? Order.ASC : Order.DESC, - entityPath.get(order.getProperty()) - )); - } List result = resultQuery.fetch(); JPAQuery countQuery = jpaQueryFactory diff --git a/src/main/java/com/dailyon/productservice/product/service/ProductService.java b/src/main/java/com/dailyon/productservice/product/service/ProductService.java index 7e7e2149..40ae74d6 100644 --- a/src/main/java/com/dailyon/productservice/product/service/ProductService.java +++ b/src/main/java/com/dailyon/productservice/product/service/ProductService.java @@ -242,15 +242,19 @@ public Slice readProductSlice( } public ReadProductPageResponse readProductPage( - Long brandId, Long categoryId, ProductType type, - String query, Pageable pageable + Long brandId, Long categoryId, ProductType type, String query, + int page, int size, String sort, String direction ) { List childCategories = null; if(categoryId != null) { childCategories = categoryRepository.findAllChildCategories(categoryId); } return ReadProductPageResponse.fromEntity( - productRepository.findProductPage(brandId, childCategories, type, query, pageable)); + productRepository.findProductPage( + brandId, childCategories, type, query, + page, size, sort, direction + ) + ); } public ReadOOTDSearchSliceResponse searchFromOOTD(Long lastId, String query) { diff --git a/src/test/java/com/dailyon/productservice/service/product/ProductServiceTests.java b/src/test/java/com/dailyon/productservice/service/product/ProductServiceTests.java index 7ef49a8b..6b33163f 100644 --- a/src/test/java/com/dailyon/productservice/service/product/ProductServiceTests.java +++ b/src/test/java/com/dailyon/productservice/service/product/ProductServiceTests.java @@ -281,7 +281,8 @@ void searchProductsFromOOTDTest() { void readProductPage() { // given, when ReadProductPageResponse response = productService.readProductPage( - null, null, ProductType.valueOf("NORMAL"), null, PageRequest.of(0, 8) + null, null, ProductType.valueOf("NORMAL"), null, + 0, 5, "updatedAt", "desc" ); // then