diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java index d8f6a59f..40be962e 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java @@ -28,20 +28,8 @@ public class StoreController { private final StoreService storeService; - @GetMapping("/all-stores") - @Operation(summary = "모든 주점 조회", description = "모든 주점을 조회합니다.") - @ApiResponse(responseCode = "200", description = "모든 주점 조회 성공") - public ResponseEntity getAllStores() { - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - storeService.getAllStores() - ) - ); - } - @GetMapping("/all-stores/infinite-scroll") + @GetMapping("/all-stores") @Operation( summary = "모든 주점 페이지네이션 조회", description = "모든 주점을 페이지네이션으로 조회합니다." @@ -57,22 +45,6 @@ public ResponseEntity getAllStoresByPageAndDeparments(Pageable pageable) { ); } - @GetMapping("/low-wait/infinite-scroll") - @Operation( - summary = "모든 주점 페이지네이션 조회", - description = "모든 주점을 페이지네이션으로 조회합니다." - ) - @ApiResponse(responseCode = "200", description = "모든 주점 페이지네이션 조회 성공") - public ResponseEntity getAllStores(Pageable pageable) { - return ResponseEntity - .ok() - .body( - ApiUtils.success( - storeService.getAllStoresByPage(pageable) - ) - ); - } - @GetMapping("/{storeId}") @Operation(summary = "주점 ID로 주점 상세 조회", description = "특정 주점을 ID로 조회합니다.") @ApiResponse(responseCode = "200", description = "주점 상세 조회 성공") diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java index 050cc091..29cd7194 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadDto.java @@ -15,6 +15,7 @@ @Builder public class StorePageReadDto { private Long storeId; + private Long waitingCount; private Long departmentId; private String departmentName; private String name; @@ -26,7 +27,7 @@ public class StorePageReadDto { private Boolean deleted; private LocalDateTime createdAt; - public static StorePageReadDto fromEntity(Store store, List allImages, String departmentName) { + public static StorePageReadDto fromEntity(Store store, List allImages, String departmentName, Long waitingCount) { StoreImageUploadResponse profile = allImages.stream() .filter(image -> image.getImageType() == ImageType.PROFILE) @@ -40,6 +41,7 @@ public static StorePageReadDto fromEntity(Store store, List stores = storeRepository.findAllByDeletedFalse(); - - List storeRead = stores.stream() - .map(store -> { - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - return StoreReadDto.fromEntity(store, imageDto); - }) - .toList(); - - boolean hasNext = false; - - return StoreReadResponse.of(storeRead, hasNext); - } - - @Override - @Transactional(readOnly = true) - public StoreReadResponse getAllStoresByPage(Pageable pageable) { - Slice stores = storeRepository.findAllByDeletedFalseOrderByStoreIdAsc(pageable); - - List storeRead = stores.getContent().stream() - .map(store -> { - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - return StoreReadDto.fromEntity(store, imageDto); - }) - .toList(); - - boolean hasNext = stores.hasNext(); - - return StoreReadResponse.of(storeRead, hasNext); - } - @Override @Transactional(readOnly = true) public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable) { @@ -94,6 +53,21 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page .distinct() .toList(); + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 + Map waitingSizeMap = storeIds.stream() + .collect(Collectors.toMap( + Function.identity(), + storeId -> { + String key = "waiting:" + storeId; + try { + return redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + return 0L; // Redis 접근 실패 시 0으로 처리 + } + + } + )); + // 3) 각 StoreId에 해당하는 이미지 조회 List allImages = storeImageRepository.findByStore_StoreIdIn(storeIds); Map> imageMap = allImages.stream() @@ -118,7 +92,9 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page .getOrDefault(store.getStoreId(), List.of()); String departmentName = deptNameMap .getOrDefault(store.getDepartmentId(), "Unknown Department"); - return StorePageReadDto.fromEntity(store, imgs, departmentName); + Long waitingCount = + waitingSizeMap.getOrDefault(store.getStoreId(), 0L); + return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount); }) .toList(); @@ -139,12 +115,21 @@ public StorePageReadDto getStoreByStoreId(Long storeId) { .map(Department::getName) .orElse("Unknown Department"); + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 + String key = "waiting:" + storeId; + Long waitingSize = 0L; + try { + redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + waitingSize = 0L; // Redis 접근 실패 시 0으로 처리 + } + List images = storeImageRepository.findByStore(store); List imageDto = images.stream() .map(StoreImageUploadResponse::fromEntity) .toList(); - return StorePageReadDto.fromEntity(store, imageDto, departmentName); + return StorePageReadDto.fromEntity(store, imageDto, departmentName, waitingSize); } @Override @@ -154,7 +139,9 @@ public List searchByKeywordNative(String keyword) { } // 1) 페이징된 Store 스냅샷 조회 + // Like 사용 // List stores = storeRepository.findByNameContainingIgnoreCaseAndDeletedFalse(keyword); + // 풀텍스트인덱스 사용 List stores = storeRepository.searchByKeywordNative(keyword); // 2) 각 StoreId / Department ID 추출 @@ -166,6 +153,20 @@ public List searchByKeywordNative(String keyword) { .distinct() .toList(); + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 + Map waitingSizeMap = storeIds.stream() + .collect(Collectors.toMap( + Function.identity(), + storeId -> { + String key = "waiting:" + storeId; + try { + return redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + return 0L; // Redis 접근 실패 시 0으로 처리 + } + } + )); + // 3) 각 StoreId에 해당하는 이미지 조회 List allImages = storeImageRepository.findByStore_StoreIdIn(storeIds); Map> imageMap = allImages.stream() @@ -189,7 +190,9 @@ public List searchByKeywordNative(String keyword) { .getOrDefault(store.getStoreId(), List.of()); String departmentName = deptNameMap .getOrDefault(store.getDepartmentId(), "Unknown Department"); - return StorePageReadDto.fromEntity(store, imgs, departmentName); + Long waitingCount = + waitingSizeMap.getOrDefault(store.getStoreId(), 0L); + return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount); }) .toList(); }