diff --git a/src/main/java/com/prgrms/nabmart/domain/item/ItemSortType.java b/src/main/java/com/prgrms/nabmart/domain/item/ItemSortType.java index 73288f99..88bdfce2 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/ItemSortType.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/ItemSortType.java @@ -22,8 +22,4 @@ public static ItemSortType from(String sortType) { .findAny() .orElseThrow(() -> new NotFoundItemSortTypeException("요청하신 정렬기준은 존재하지 않습니다.")); } - - public boolean isPopular() { - return this == POPULAR; - } } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/controller/ItemController.java b/src/main/java/com/prgrms/nabmart/domain/item/controller/ItemController.java index e62111c9..3ceec61b 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/controller/ItemController.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/controller/ItemController.java @@ -17,6 +17,7 @@ import java.net.URI; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -40,15 +41,13 @@ public class ItemController { @GetMapping public ResponseEntity findItemsByCategory( - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastItemId, - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastIdx, - @RequestParam int size, + Pageable pageable, @RequestParam String main, @RequestParam(required = false) String sub, @RequestParam String sort) { FindItemsByCategoryCommand findItemsByCategoryCommand = FindItemsByCategoryCommand.of( - lastItemId, lastIdx, main, sub, size, sort); + pageable.getPageNumber(), pageable.getPageSize(), main, sub, sort); FindItemsResponse findItemsResponse = itemService.findItemsByCategory( findItemsByCategoryCommand); return ResponseEntity.ok(findItemsResponse); @@ -61,14 +60,9 @@ public ResponseEntity findItemDetail(@PathVariable Long } @GetMapping("/new") - public ResponseEntity findNewItems( - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastIdx, - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastItemId, - @RequestParam int size, - @RequestParam(defaultValue = "POPULAR") String sort - ) { - FindNewItemsCommand findNewItemsCommand = FindNewItemsCommand.of(lastIdx, lastItemId, size, - sort); + public ResponseEntity findNewItems(Pageable pageable) { + FindNewItemsCommand findNewItemsCommand = FindNewItemsCommand.of(pageable.getPageNumber(), + pageable.getPageSize()); return ResponseEntity.ok(itemService.findNewItems(findNewItemsCommand)); } @@ -80,14 +74,9 @@ public ResponseEntity findNewItemsWithRedis( } @GetMapping("/hot") - public ResponseEntity findHotItems( - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastIdx, - @RequestParam(defaultValue = DEFAULT_PREVIOUS_ID) Long lastItemId, - @RequestParam int size, - @RequestParam(defaultValue = "POPULAR") String sort - ) { - FindHotItemsCommand findHotItemsCommand = FindHotItemsCommand.of(lastIdx, lastItemId, size, - sort); + public ResponseEntity findHotItems(Pageable pageable) { + FindHotItemsCommand findHotItemsCommand = FindHotItemsCommand.of(pageable.getPageSize(), + pageable.getPageSize()); return ResponseEntity.ok(itemService.findHotItems(findHotItemsCommand)); } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryCustom.java b/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryCustom.java index 040fe4b4..be0dbd69 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryCustom.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryCustom.java @@ -9,15 +9,13 @@ public interface ItemRepositoryCustom { - List findNewItemsOrderBy(Long lastIdx, Long lastItemId, ItemSortType sortType, - Pageable pageable); + List findNewItemsOrderBy(Pageable pageable); - List findHotItemsOrderBy(Long lastIdx, Long lastItemId, ItemSortType sortType, - Pageable pageable); + List findHotItemsOrderBy(Pageable pageable); - List findByMainCategoryOrderBy(MainCategory mainCategory, Long lastIdx, Long lastItemId, - ItemSortType sortType, Pageable pageable); + List findByMainCategoryOrderBy(MainCategory mainCategory, ItemSortType sortType, + Pageable pageable); List findBySubCategoryOrderBy(MainCategory mainCategory, SubCategory subCategory, - Long lastIdx, Long lastItemId, ItemSortType sortType, Pageable pageable); + ItemSortType sortType, Pageable pageable); } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryImpl.java b/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryImpl.java index 6c660852..aa0ce091 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryImpl.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryImpl.java @@ -1,7 +1,6 @@ package com.prgrms.nabmart.domain.item.repository; import static com.prgrms.nabmart.domain.item.QItem.item; -import static com.prgrms.nabmart.domain.order.QOrderItem.orderItem; import static com.prgrms.nabmart.domain.statistics.QStatistics.statistics; import com.prgrms.nabmart.domain.category.MainCategory; @@ -11,11 +10,8 @@ import com.querydsl.core.types.Order; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Predicate; -import com.querydsl.jpa.JPAExpressions; -import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -31,98 +27,61 @@ public class ItemRepositoryImpl implements ItemRepositoryCustom { private static final int HOT_PRODUCT_REFERENCE_ORDERS = 10; @Override - public List findNewItemsOrderBy(Long lastIdx, Long lastItemId, ItemSortType sortType, - Pageable pageable) { - OrderSpecifier orderSpecifier = createOrderSpecifier(sortType); + public List findNewItemsOrderBy(Pageable pageable) { Predicate predicate = item.createdAt.after( - LocalDateTime.now().minus(NEW_PRODUCT_REFERENCE_TIME, ChronoUnit.WEEKS)); + LocalDateTime.now().minusWeeks(NEW_PRODUCT_REFERENCE_TIME)); return queryFactory .selectFrom(item) - .join(item.statistics, statistics) .where(predicate) - .groupBy(item) - .having( - getCondition(lastIdx, lastItemId, sortType) - ) - .orderBy(orderSpecifier, item.itemId.asc()) + .orderBy(item.createdAt.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); } @Override - public List findHotItemsOrderBy(Long lastIdx, Long lastItemId, ItemSortType sortType, - Pageable pageable) { - OrderSpecifier orderSpecifier = createOrderSpecifier(sortType); - Predicate predicate = item.rate.gt(HOT_PRODUCT_REFERENCE_RATE); - Predicate orderCondition = JPAExpressions.select(orderItem.quantity.sum().coalesce(0)) - .from(orderItem) - .where(orderItem.itemId.eq(item.itemId)) - .gt(HOT_PRODUCT_REFERENCE_ORDERS); + public List findHotItemsOrderBy(Pageable pageable) { return queryFactory .selectFrom(item) .join(item.statistics, statistics) - .where(predicate, getCondition(lastIdx, lastItemId, sortType)) - .groupBy(item) - .having( - getCondition(lastIdx, lastItemId, sortType), - orderCondition - ) - .orderBy(orderSpecifier, item.itemId.asc()) + .where(item.rate.gt(HOT_PRODUCT_REFERENCE_RATE) + .and(item.statistics.orders.gt(HOT_PRODUCT_REFERENCE_ORDERS))) + .orderBy(item.statistics.orders.desc(), item.itemId.asc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); } @Override - public List findByMainCategoryOrderBy(MainCategory mainCategory, Long lastIdx, - Long lastItemId, ItemSortType sortType, Pageable pageable) { - - Predicate mainCategoryCondition = item.mainCategory.eq(mainCategory); - OrderSpecifier orderSpecifier = createOrderSpecifier(sortType); + public List findByMainCategoryOrderBy(MainCategory mainCategory, ItemSortType sortType, + Pageable pageable) { return queryFactory.selectFrom(item) - .where(mainCategoryCondition, getCondition(lastIdx, lastItemId, sortType)) - .orderBy(orderSpecifier, item.itemId.desc()) + .where(item.mainCategory.eq(mainCategory)) + .orderBy(createOrderSpecifier(sortType), item.itemId.desc()) + .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); } @Override public List findBySubCategoryOrderBy(MainCategory mainCategory, SubCategory subCategory, - Long lastIdx, Long lastItemId, ItemSortType sortType, Pageable pageable) { - - Predicate mainCategoryCondition = item.mainCategory.eq(mainCategory); - Predicate subCategoryCondition = item.subCategory.eq(subCategory); - OrderSpecifier orderSpecifier = createOrderSpecifier(sortType); + ItemSortType sortType, Pageable pageable) { return queryFactory.selectFrom(item) - .where(mainCategoryCondition, subCategoryCondition, - getCondition(lastIdx, lastItemId, sortType)) - .orderBy(orderSpecifier, item.itemId.desc()) + .where(item.mainCategory.eq(mainCategory), item.subCategory.eq(subCategory)) + .orderBy(createOrderSpecifier(sortType), item.itemId.desc()) + .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); } - private Predicate getCondition(Long lastIdx, Long lastItemId, ItemSortType sortType) { - return switch (sortType) { - case NEW -> item.itemId.lt(lastIdx); - case HIGHEST_AMOUNT -> item.price.lt(lastIdx) - .or(item.price.eq(lastIdx.intValue()).and(item.itemId.lt(lastItemId))); - case LOWEST_AMOUNT -> item.price.gt(lastIdx) - .or(item.price.eq(lastIdx.intValue()).and(item.itemId.lt(lastItemId))); - case DISCOUNT -> item.discount.lt(lastIdx) - .or(item.discount.eq(lastIdx.intValue()).and(item.itemId.lt(lastItemId))); - default -> item.statistics.orders.lt(lastIdx); - }; - } - private OrderSpecifier createOrderSpecifier(ItemSortType sortType) { return switch (sortType) { - case NEW -> new OrderSpecifier<>(Order.DESC, item.itemId); + case NEW -> new OrderSpecifier<>(Order.DESC, item.createdAt); case HIGHEST_AMOUNT -> new OrderSpecifier<>(Order.DESC, item.price); case LOWEST_AMOUNT -> new OrderSpecifier<>(Order.ASC, item.price); case DISCOUNT -> new OrderSpecifier<>(Order.DESC, item.discount); diff --git a/src/main/java/com/prgrms/nabmart/domain/item/service/ItemService.java b/src/main/java/com/prgrms/nabmart/domain/item/service/ItemService.java index a5225bf2..dd0a81ca 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/service/ItemService.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/service/ItemService.java @@ -20,7 +20,6 @@ import com.prgrms.nabmart.domain.item.service.response.FindNewItemsResponse; import com.prgrms.nabmart.domain.item.service.response.FindNewItemsResponse.FindNewItemResponse; import com.prgrms.nabmart.domain.item.service.response.ItemRedisDto; -import com.prgrms.nabmart.domain.order.repository.OrderItemRepository; import com.prgrms.nabmart.domain.review.service.RedisCacheService; import java.util.ArrayList; import java.util.Comparator; @@ -103,9 +102,7 @@ public FindItemDetailResponse findItemDetail(FindItemDetailCommand findItemDetai @Transactional(readOnly = true) public FindItemsResponse findNewItems(FindNewItemsCommand findNewItemsCommand) { return FindItemsResponse.from( - itemRepository.findNewItemsOrderBy(findNewItemsCommand.lastIdx(), - findNewItemsCommand.lastItemId(), findNewItemsCommand.sortType(), - findNewItemsCommand.pageRequest())); + itemRepository.findNewItemsOrderBy(findNewItemsCommand.pageRequest())); } @Transactional(readOnly = true) @@ -176,23 +173,18 @@ private MainCategory getMainCategoryById(Long mainCategoryId) { private List findItemsByMainCategoryFrom( FindItemsByCategoryCommand findItemsByCategoryCommand) { - Long lastItemId = findItemsByCategoryCommand.lastItemId(); - Long lastIdx = findItemsByCategoryCommand.lastIdx(); ItemSortType itemSortType = findItemsByCategoryCommand.itemSortType(); PageRequest pageRequest = findItemsByCategoryCommand.pageRequest(); String mainCategoryName = findItemsByCategoryCommand.mainCategoryName().toLowerCase(); MainCategory mainCategory = mainCategoryRepository.findByName(mainCategoryName) .orElseThrow(() -> new NotFoundCategoryException("없는 대카테고리입니다.")); - return itemRepository.findByMainCategoryOrderBy(mainCategory, lastIdx, lastItemId, - itemSortType, pageRequest); + return itemRepository.findByMainCategoryOrderBy(mainCategory, itemSortType, pageRequest); } private List findItemsBySubCategoryFrom( FindItemsByCategoryCommand findItemsByCategoryCommand) { - Long lastItemId = findItemsByCategoryCommand.lastItemId(); - Long lastIdx = findItemsByCategoryCommand.lastIdx(); ItemSortType itemSortType = findItemsByCategoryCommand.itemSortType(); PageRequest pageRequest = findItemsByCategoryCommand.pageRequest(); String mainCategoryName = findItemsByCategoryCommand.mainCategoryName().toLowerCase(); @@ -202,15 +194,13 @@ private List findItemsBySubCategoryFrom( SubCategory subCategory = subCategoryRepository.findByName(subCategoryName) .orElseThrow(() -> new NotFoundCategoryException("없는 소카테고리입니다.")); - return itemRepository.findBySubCategoryOrderBy(mainCategory, subCategory, lastIdx, - lastItemId, itemSortType, pageRequest); + return itemRepository.findBySubCategoryOrderBy(mainCategory, subCategory, itemSortType, + pageRequest); } @Transactional(readOnly = true) public FindItemsResponse findHotItems(FindHotItemsCommand findHotItemsCommand) { - List items = itemRepository.findHotItemsOrderBy(findHotItemsCommand.lastIdx(), - findHotItemsCommand.lastItemId(), findHotItemsCommand.sortType(), - findHotItemsCommand.pageRequest()); + List items = itemRepository.findHotItemsOrderBy(findHotItemsCommand.pageRequest()); return FindItemsResponse.from(items); } } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindHotItemsCommand.java b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindHotItemsCommand.java index 5143dbfe..dddfe096 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindHotItemsCommand.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindHotItemsCommand.java @@ -1,33 +1,11 @@ package com.prgrms.nabmart.domain.item.service.request; -import com.prgrms.nabmart.domain.item.ItemSortType; -import java.util.Objects; import org.springframework.data.domain.PageRequest; -public record FindHotItemsCommand( - Long lastIdx, - Long lastItemId, - PageRequest pageRequest, - ItemSortType sortType -) { +public record FindHotItemsCommand(PageRequest pageRequest) { - private static final int DEFAULT_PAGE_NUMBER = 0; - - public static FindHotItemsCommand of(Long lastIdx, Long lastItemId, int pageSize, - String sortType) { - if (isFirstIdx(lastIdx)) { - lastIdx = Long.parseLong(String.valueOf(Integer.MAX_VALUE)); - if (Objects.equals(sortType, "LOWEST_AMOUNT") || Objects.equals(sortType, "NEW")) { - lastIdx = Long.MIN_VALUE; - } - } - - ItemSortType itemSortType = ItemSortType.from(sortType); - PageRequest pageRequest = PageRequest.of(DEFAULT_PAGE_NUMBER, pageSize); - return new FindHotItemsCommand(lastIdx, lastItemId, pageRequest, itemSortType); - } - - private static boolean isFirstIdx(Long previousItemId) { - return previousItemId < 0; + public static FindHotItemsCommand of(int page, int size) { + PageRequest pageRequest = PageRequest.of(page, size); + return new FindHotItemsCommand(pageRequest); } } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindItemsByCategoryCommand.java b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindItemsByCategoryCommand.java index 62f4a572..8ca23639 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindItemsByCategoryCommand.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindItemsByCategoryCommand.java @@ -7,30 +7,19 @@ @Slf4j public record FindItemsByCategoryCommand( - Long lastItemId, - Long lastIdx, String mainCategoryName, String subCategoryName, PageRequest pageRequest, ItemSortType itemSortType) { - private static final int DEFAULT_PAGE_NUMBER = 0; - - public static FindItemsByCategoryCommand of( - Long lastItemId, Long lastIdx, String mainCategoryName, String subCategoryName, - int pageSize, - String sortType + public static FindItemsByCategoryCommand of(int page, int size, String mainCategoryName, + String subCategoryName, String sortType ) { + validateMainCategoryName(mainCategoryName); ItemSortType itemSortType = ItemSortType.from(sortType); - PageRequest pageRequest = PageRequest.of(DEFAULT_PAGE_NUMBER, pageSize); - if (isFirstItemId(lastItemId)) { - lastIdx = redeclareLastIdx(itemSortType); - lastItemId = Long.MAX_VALUE; - } - return new FindItemsByCategoryCommand(lastItemId, lastIdx, mainCategoryName, - subCategoryName, - pageRequest, + PageRequest pageRequest = PageRequest.of(page, size); + return new FindItemsByCategoryCommand(mainCategoryName, subCategoryName, pageRequest, itemSortType); } @@ -39,12 +28,4 @@ private static void validateMainCategoryName(String mainCategoryName) { throw new NotFoundCategoryException("카테고리명은 필수 항목입니다."); } } - - private static boolean isFirstItemId(Long previousItemId) { - return previousItemId < 0; - } - - private static long redeclareLastIdx(ItemSortType itemSortType) { - return itemSortType.getDefaultValue(); - } } diff --git a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindNewItemsCommand.java b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindNewItemsCommand.java index d1180d65..704551ec 100644 --- a/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindNewItemsCommand.java +++ b/src/main/java/com/prgrms/nabmart/domain/item/service/request/FindNewItemsCommand.java @@ -1,36 +1,11 @@ package com.prgrms.nabmart.domain.item.service.request; -import com.prgrms.nabmart.domain.item.ItemSortType; -import java.util.Objects; import org.springframework.data.domain.PageRequest; -public record FindNewItemsCommand( - Long lastIdx, - Long lastItemId, - PageRequest pageRequest, - ItemSortType sortType) { +public record FindNewItemsCommand(PageRequest pageRequest) { - private static final int DEFAULT_PAGE_NUMBER = 0; - - public static FindNewItemsCommand of(Long lastIdx, Long lastItemId, int pageSize, - String sortType) { - if (isFirstIdx(lastIdx)) { - lastIdx = Long.parseLong(String.valueOf(Integer.MAX_VALUE)); - if (Objects.equals(sortType, "LOWEST_AMOUNT") || Objects.equals(sortType, "NEW")) { - lastIdx = Long.MIN_VALUE; - } - } - - if (isFirstIdx(lastItemId)) { - lastItemId = Long.parseLong(String.valueOf(Integer.MAX_VALUE)); - } - - ItemSortType itemSortType = ItemSortType.from(sortType); - PageRequest pageRequest = PageRequest.of(DEFAULT_PAGE_NUMBER, pageSize); - return new FindNewItemsCommand(lastIdx, lastItemId, pageRequest, itemSortType); - } - - private static boolean isFirstIdx(Long previousItemId) { - return previousItemId < 0; + public static FindNewItemsCommand of(int page, int size) { + PageRequest pageRequest = PageRequest.of(page, size); + return new FindNewItemsCommand(pageRequest); } } diff --git a/src/test/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryTest.java b/src/test/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryTest.java index 8ef0ba03..98048977 100644 --- a/src/test/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryTest.java +++ b/src/test/java/com/prgrms/nabmart/domain/item/repository/ItemRepositoryTest.java @@ -17,7 +17,6 @@ import com.prgrms.nabmart.domain.statistics.StatisticsRepository; import jakarta.persistence.EntityManager; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.AfterEach; @@ -47,7 +46,7 @@ class ItemRepositoryTest { EntityManager entityManager; @AfterEach - public void teardown() { + void teardown() { this.itemRepository.deleteAll(); this.entityManager .createNativeQuery("ALTER TABLE item ALTER COLUMN `item_id` RESTART WITH 1") @@ -63,7 +62,7 @@ class FindByMainCategoryByCriteria { @Test @DisplayName("최신순으로 조회된다.") - public void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { + void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { //Given List savedItems = new ArrayList<>(); mainCategoryRepository.save(mainCategory); @@ -75,28 +74,18 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); - List items = itemRepository.findByMainCategoryOrderBy( - mainCategory, 30L, Long.MAX_VALUE, + List result = itemRepository.findByMainCategoryOrderBy(mainCategory, ItemSortType.NEW, pageRequest); // Then - assertThat(items.size()).isEqualTo(5); - List expectedItems = savedItems.subList(24, 29); - Collections.reverse(expectedItems); - List actual = items.stream() - .map(Item::getName) - .toList(); - List expected = expectedItems.stream() - .map(Item::getName) - .toList(); - - assertThat(actual).usingRecursiveComparison() - .isEqualTo(expected); + assertThat(result).hasSize(5); + savedItems.sort((o1, o2) -> Math.toIntExact(o2.getItemId() - o1.getItemId())); + assertThat(result).usingRecursiveComparison().isEqualTo(savedItems.subList(0, 5)); } @Test @DisplayName("할인율 높은 순으로 조회된다.") - public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { + void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { //Given mainCategoryRepository.save(mainCategory); subCategoryRepository.save(subCategory); @@ -108,8 +97,7 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findByMainCategoryOrderBy( - mainCategory, 100L, Long.MAX_VALUE, - ItemSortType.DISCOUNT, pageRequest); + mainCategory, ItemSortType.DISCOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -117,7 +105,7 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { @Test @DisplayName("금액 높은 순으로 조회된다.") - public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { + void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { //Given mainCategoryRepository.save(mainCategory); for (int i = 0; i < 50; i++) { @@ -128,8 +116,7 @@ public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findByMainCategoryOrderBy( - mainCategory, 10000L, Long.MAX_VALUE, - ItemSortType.HIGHEST_AMOUNT, pageRequest); + mainCategory, ItemSortType.HIGHEST_AMOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -137,7 +124,7 @@ public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { @Test @DisplayName("금액 낮은 순으로 조회된다.") - public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { + void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { //Given mainCategoryRepository.save(mainCategory); subCategoryRepository.save(subCategory); @@ -148,8 +135,7 @@ public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findByMainCategoryOrderBy( - mainCategory, 0L, Long.MAX_VALUE, - ItemSortType.LOWEST_AMOUNT, pageRequest); + mainCategory, ItemSortType.LOWEST_AMOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -158,7 +144,7 @@ public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { @Test @DisplayName("인기 순으로 조회된다.") - public void findByOrderCount() { + void findByOrderCount() { //Given mainCategoryRepository.save(mainCategory); @@ -175,8 +161,7 @@ public void findByOrderCount() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findByMainCategoryOrderBy( - mainCategory, 10000L, Long.MAX_VALUE, - ItemSortType.POPULAR, pageRequest); + mainCategory, ItemSortType.POPULAR, pageRequest); // Then assertThat(items).map(Item::getItemId) @@ -193,7 +178,7 @@ class FindBySubCategoryByCriteria { @Test @DisplayName("최신순으로 조회된다.") - public void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { + void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { //Given List savedItems = new ArrayList<>(); mainCategoryRepository.save(mainCategory); @@ -204,29 +189,20 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDesc() { } // When - PageRequest pageRequest = PageRequest.of(0, 5); - List items = itemRepository.findBySubCategoryOrderBy( - mainCategory, subCategory, 30L, Long.MAX_VALUE, - ItemSortType.NEW, pageRequest); + List result = itemRepository.findBySubCategoryOrderBy( + mainCategory, subCategory, ItemSortType.NEW, PageRequest.of(0, 5)); // Then - assertThat(items.size()).isEqualTo(5); - List expectedItems = savedItems.subList(24, 29); - Collections.reverse(expectedItems); - List actual = items.stream() - .map(Item::getName) - .toList(); - List expected = expectedItems.stream() - .map(Item::getName) - .toList(); + assertThat(result).hasSize(5); + savedItems.sort((o1, o2) -> Math.toIntExact(o2.getItemId() - o1.getItemId())); - assertThat(actual).usingRecursiveComparison() - .isEqualTo(expected); + assertThat(result).usingRecursiveComparison() + .isEqualTo(savedItems.subList(0, 5)); } @Test @DisplayName("할인율 높은 순으로 조회된다.") - public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { + void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { //Given mainCategoryRepository.save(mainCategory); subCategoryRepository.save(subCategory); @@ -239,8 +215,7 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findBySubCategoryOrderBy( - mainCategory, subCategory, 100L, Long.MAX_VALUE, - ItemSortType.DISCOUNT, pageRequest); + mainCategory, subCategory, ItemSortType.DISCOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -248,7 +223,7 @@ public void findByItemIdLessThanAndMainCategoryOrderByItemIdDescDiscountDesc() { @Test @DisplayName("금액 높은 순으로 조회된다.") - public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { + void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { //Given mainCategoryRepository.save(mainCategory); subCategoryRepository.save(subCategory); @@ -260,8 +235,7 @@ public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findBySubCategoryOrderBy( - mainCategory, subCategory, 100000L, Long.MAX_VALUE, - ItemSortType.HIGHEST_AMOUNT, pageRequest); + mainCategory, subCategory, ItemSortType.HIGHEST_AMOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -269,7 +243,7 @@ public void findByPriceLessThanAndMainCategoryOrderByPriceDescItemIdDesc() { @Test @DisplayName("금액 낮은 순으로 조회된다.") - public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { + void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { //Given mainCategoryRepository.save(mainCategory); subCategoryRepository.save(subCategory); @@ -281,8 +255,7 @@ public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findBySubCategoryOrderBy( - mainCategory, subCategory, 0L, Long.MAX_VALUE, - ItemSortType.LOWEST_AMOUNT, pageRequest); + mainCategory, subCategory, ItemSortType.LOWEST_AMOUNT, pageRequest); // Then assertThat(items.size()).isEqualTo(5); @@ -290,7 +263,7 @@ public void findByPriceGreaterThanAndMainCategoryOrderByPriceAscItemIdDesc() { @Test @DisplayName("인기 순으로 조회된다.") - public void findByOrderCount() { + void findByOrderCount() { //Given mainCategoryRepository.save(mainCategory); @@ -308,8 +281,7 @@ public void findByOrderCount() { // When PageRequest pageRequest = PageRequest.of(0, 5); List items = itemRepository.findBySubCategoryOrderBy( - mainCategory, subCategory, 10000L, Long.MAX_VALUE, - ItemSortType.POPULAR, pageRequest); + mainCategory, subCategory, ItemSortType.POPULAR, pageRequest); List actual = items.stream() .map(Item::getItemId) @@ -323,7 +295,7 @@ public void findByOrderCount() { @Test @DisplayName("아이템 삭제 시, 아이템 조회가 안된다.") - public void deleteItem() { + void deleteItem() { // Given MainCategory mainCategory = new MainCategory("main"); SubCategory subCategory = new SubCategory(mainCategory, "sub"); @@ -344,7 +316,7 @@ class IncreaseQuantityTest { @Test @DisplayName("성공") - public void success() { + void success() { // Given int increaseQuantity = 100; Item item = item(); diff --git a/src/test/java/com/prgrms/nabmart/domain/item/service/ItemServiceTest.java b/src/test/java/com/prgrms/nabmart/domain/item/service/ItemServiceTest.java index 835ceca2..8df07602 100644 --- a/src/test/java/com/prgrms/nabmart/domain/item/service/ItemServiceTest.java +++ b/src/test/java/com/prgrms/nabmart/domain/item/service/ItemServiceTest.java @@ -132,8 +132,8 @@ public void orderByLatest() { ItemSortType.NEW); when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); - when(itemRepository.findByMainCategoryOrderBy(any(), anyLong(), anyLong(), any(), - any())).thenReturn(expectedItems); + when(itemRepository.findByMainCategoryOrderBy(any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -154,8 +154,8 @@ public void orderByDiscountRateDesc() { FindItemsByCategoryCommand findItemsByCategoryCommand = getFindItemsByCategoryCommand( ItemSortType.DISCOUNT); when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); - when(itemRepository.findByMainCategoryOrderBy( - any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findByMainCategoryOrderBy(any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -174,8 +174,8 @@ public void orderByPriceDesc() { ItemSortType.HIGHEST_AMOUNT); when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); - when(itemRepository.findByMainCategoryOrderBy(any(), anyLong(), anyLong(), any(), - any())).thenReturn(expectedItems); + when(itemRepository.findByMainCategoryOrderBy(any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -194,8 +194,8 @@ public void orderByPriceAsc() { ItemSortType.LOWEST_AMOUNT); when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); - when(itemRepository.findByMainCategoryOrderBy(any(), anyLong(), anyLong(), any(), - any())).thenReturn(expectedItems); + when(itemRepository.findByMainCategoryOrderBy(any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -214,8 +214,8 @@ public void orderByOrderedQuantity() { ItemSortType.POPULAR); when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); - when(itemRepository.findByMainCategoryOrderBy( - any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findByMainCategoryOrderBy(any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -227,8 +227,7 @@ public void orderByOrderedQuantity() { private FindItemsByCategoryCommand getFindItemsByCategoryCommand( ItemSortType itemSortType) { - return new FindItemsByCategoryCommand( - -1L, -1L, mainCategory.getName(), null, + return new FindItemsByCategoryCommand(mainCategory.getName(), null, PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE), itemSortType); } @@ -288,8 +287,8 @@ public void orderByLatest() { when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); when(subCategoryRepository.findByName(any())).thenReturn(Optional.of(subCategory)); - when(itemRepository.findBySubCategoryOrderBy( - any(), any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findBySubCategoryOrderBy(any(), any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -312,8 +311,8 @@ public void orderByDiscountRateDesc() { when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); when(subCategoryRepository.findByName(any())).thenReturn(Optional.of(subCategory)); - when(itemRepository.findBySubCategoryOrderBy( - any(), any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findBySubCategoryOrderBy(any(), any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -333,8 +332,8 @@ public void orderByPriceDesc() { when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); when(subCategoryRepository.findByName(any())).thenReturn(Optional.of(subCategory)); - when(itemRepository.findBySubCategoryOrderBy( - any(), any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findBySubCategoryOrderBy(any(), any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -354,8 +353,8 @@ public void orderByPriceAsc() { when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); when(subCategoryRepository.findByName(any())).thenReturn(Optional.of(subCategory)); - when(itemRepository.findBySubCategoryOrderBy( - any(), any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findBySubCategoryOrderBy(any(), any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -375,8 +374,8 @@ public void orderByOrderedQuantity() { when(mainCategoryRepository.findByName(any())).thenReturn(Optional.of(mainCategory)); when(subCategoryRepository.findByName(any())).thenReturn(Optional.of(subCategory)); - when(itemRepository.findBySubCategoryOrderBy( - any(), any(), anyLong(), anyLong(), any(), any())).thenReturn(expectedItems); + when(itemRepository.findBySubCategoryOrderBy(any(), any(), any(), any())).thenReturn( + expectedItems); // When FindItemsResponse itemsResponse = itemService.findItemsByCategory( @@ -388,8 +387,7 @@ public void orderByOrderedQuantity() { private FindItemsByCategoryCommand getFindItemsByCategoryCommand( ItemSortType itemSortType) { - return new FindItemsByCategoryCommand( - -1L, -1L, mainCategory.getName(), subCategory.getName(), + return new FindItemsByCategoryCommand(mainCategory.getName(), subCategory.getName(), PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE), itemSortType); } @@ -506,7 +504,7 @@ public void orderByLatest() { List expectedItems = List.of(item1, item2, item3); FindNewItemsCommand command = getFindNewItemsCommand(ItemSortType.NEW); - when(itemRepository.findNewItemsOrderBy(anyLong(), anyLong(), any(), any())).thenReturn( + when(itemRepository.findNewItemsOrderBy(any())).thenReturn( expectedItems); // When @@ -525,7 +523,7 @@ public void orderByDiscount() { List expectedItems = List.of(item3, item2, item1); FindNewItemsCommand command = getFindNewItemsCommand(ItemSortType.DISCOUNT); - when(itemRepository.findNewItemsOrderBy(anyLong(), anyLong(), any(), any())).thenReturn( + when(itemRepository.findNewItemsOrderBy(any())).thenReturn( expectedItems); // When @@ -544,7 +542,7 @@ public void orderByPriceDesc() { List expectedItems = List.of(item3, item2, item1); FindNewItemsCommand command = getFindNewItemsCommand(ItemSortType.HIGHEST_AMOUNT); - when(itemRepository.findNewItemsOrderBy(anyLong(), anyLong(), any(), any())).thenReturn( + when(itemRepository.findNewItemsOrderBy(any())).thenReturn( expectedItems); // When @@ -563,7 +561,7 @@ public void orderByPriceAsc() { List expectedItems = List.of(item1, item2, item3); FindNewItemsCommand command = getFindNewItemsCommand(ItemSortType.LOWEST_AMOUNT); - when(itemRepository.findNewItemsOrderBy(anyLong(), anyLong(), any(), any())).thenReturn( + when(itemRepository.findNewItemsOrderBy(any())).thenReturn( expectedItems); // When @@ -582,7 +580,7 @@ public void orderByOrderedQuantity() { List expectedItems = List.of(item2, item3); FindNewItemsCommand command = getFindNewItemsCommand(ItemSortType.POPULAR); - when(itemRepository.findNewItemsOrderBy(anyLong(), anyLong(), any(), any())).thenReturn( + when(itemRepository.findNewItemsOrderBy(any())).thenReturn( expectedItems); // When @@ -593,9 +591,7 @@ public void orderByOrderedQuantity() { } private FindNewItemsCommand getFindNewItemsCommand(ItemSortType itemSortType) { - return new FindNewItemsCommand(-1L, -1L, - PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE), - itemSortType); + return new FindNewItemsCommand(PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE)); } } @@ -645,7 +641,7 @@ public void orderByLatest() { List expectedItems = List.of(item1, item2, item3); FindHotItemsCommand command = getFindHotItemsCommand(ItemSortType.NEW); - when(itemRepository.findHotItemsOrderBy(anyLong(), anyLong(), any(), any())) + when(itemRepository.findHotItemsOrderBy(any())) .thenReturn(expectedItems); // When @@ -664,7 +660,7 @@ public void orderByDiscount() { List expectedItems = List.of(item3, item2, item1); FindHotItemsCommand command = getFindHotItemsCommand(ItemSortType.DISCOUNT); - when(itemRepository.findHotItemsOrderBy(anyLong(), anyLong(), any(), any())) + when(itemRepository.findHotItemsOrderBy(any())) .thenReturn(expectedItems); // When @@ -683,7 +679,7 @@ public void orderByPriceDesc() { List expectedItems = List.of(item3, item2, item1); FindHotItemsCommand command = getFindHotItemsCommand(ItemSortType.HIGHEST_AMOUNT); - when(itemRepository.findHotItemsOrderBy(anyLong(), anyLong(), any(), any())) + when(itemRepository.findHotItemsOrderBy(any())) .thenReturn(expectedItems); // When @@ -702,7 +698,7 @@ public void orderByPriceAsc() { List expectedItems = List.of(item1, item2, item3); FindHotItemsCommand command = getFindHotItemsCommand(ItemSortType.LOWEST_AMOUNT); - when(itemRepository.findHotItemsOrderBy(anyLong(), anyLong(), any(), any())) + when(itemRepository.findHotItemsOrderBy(any())) .thenReturn(expectedItems); // When @@ -721,7 +717,7 @@ public void orderByOrderedQuantity() { List expectedItems = List.of(item2, item3); FindHotItemsCommand command = getFindHotItemsCommand(ItemSortType.POPULAR); - when(itemRepository.findHotItemsOrderBy(anyLong(), anyLong(), any(), any())) + when(itemRepository.findHotItemsOrderBy(any())) .thenReturn(expectedItems); // When @@ -732,9 +728,7 @@ public void orderByOrderedQuantity() { } private FindHotItemsCommand getFindHotItemsCommand(ItemSortType itemSortType) { - return new FindHotItemsCommand(-1L, -1L, - PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE), - itemSortType); + return new FindHotItemsCommand(PageRequest.of(DEFAULT_PAGE_NUM, DEFAULT_PAGE_SIZE)); } } } diff --git a/src/test/java/com/prgrms/nabmart/domain/item/support/ItemFixture.java b/src/test/java/com/prgrms/nabmart/domain/item/support/ItemFixture.java index 0a12a175..72c4882a 100644 --- a/src/test/java/com/prgrms/nabmart/domain/item/support/ItemFixture.java +++ b/src/test/java/com/prgrms/nabmart/domain/item/support/ItemFixture.java @@ -14,7 +14,6 @@ import com.prgrms.nabmart.domain.item.service.request.DeleteLikeItemCommand; import com.prgrms.nabmart.domain.item.service.request.FindItemsByCategoryCommand; import com.prgrms.nabmart.domain.item.service.request.FindLikeItemsCommand; -import com.prgrms.nabmart.domain.item.service.request.FindNewItemsCommand; import com.prgrms.nabmart.domain.item.service.request.RegisterItemCommand; import com.prgrms.nabmart.domain.item.service.request.UpdateItemCommand; import com.prgrms.nabmart.domain.item.service.response.FindItemsResponse; @@ -78,7 +77,7 @@ public static FindItemResponse findItemResponse() { public static FindItemsByCategoryCommand findItemsByCategoryCommand( String mainCategoryName, String subCategoryName) { - return FindItemsByCategoryCommand.of(-1L, -1L, mainCategoryName, subCategoryName, 3, + return FindItemsByCategoryCommand.of(0, 10, mainCategoryName, subCategoryName, ITEM_SORT_TYPE); } @@ -110,11 +109,6 @@ public static FindLikeItemsResponse findLikeItemsResponse() { return new FindLikeItemsResponse(List.of(findLikeItemResponse), 0, 1); } - public static FindNewItemsCommand findNewItemsCommand() { - PageRequest pageRequest = PageRequest.of(0, 5); - return new FindNewItemsCommand(null, null, pageRequest, ItemSortType.NEW); - } - public static UpdateItemRequest updateItemRequest() { return new UpdateItemRequest(NAME, PRICE, QUANTITY, DISCOUNT, MAX_QUANTITY, DESCRIPTION, 1L, 1L);