From cb090401eb3e48d291212cd18ad2fd29ca2b5523 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Fri, 25 Jul 2025 11:51:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor(Store):=20store=20waiting=20count?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nowait/applicationuser/store/dto/StorePageReadDto.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 Date: Fri, 25 Jul 2025 11:51:53 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor(Store):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20controller=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/StoreController.java | 28 ------------------- 1 file changed, 28 deletions(-) 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..4a7e6653 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,18 +28,6 @@ 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") @Operation( @@ -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 = "주점 상세 조회 성공") From 5447f7be8bc88bd32cefe8bf7426ee9458723298 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Fri, 25 Jul 2025 11:52:14 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor(Store):=20store=20waiting=20count?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/service/StoreService.java | 4 - .../store/service/StoreServiceImpl.java | 79 ++++++++----------- 2 files changed, 34 insertions(+), 49 deletions(-) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java index f8e01bd7..35588fce 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java @@ -12,10 +12,6 @@ public interface StoreService { - StoreReadResponse getAllStores(); - - StoreReadResponse getAllStoresByPage(Pageable pageable); - StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable); StorePageReadDto getStoreByStoreId(Long storeId); diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java index 6fbde78e..23ba3a83 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import org.springframework.data.domain.Pageable; @@ -14,8 +15,6 @@ import com.nowait.applicationuser.store.dto.StoreDepartmentReadResponse; import com.nowait.applicationuser.store.dto.StoreImageUploadResponse; import com.nowait.applicationuser.store.dto.StorePageReadDto; -import com.nowait.applicationuser.store.dto.StoreReadDto; -import com.nowait.applicationuser.store.dto.StoreReadResponse; import com.nowait.applicationuser.store.dto.StoreWaitingInfo; import com.nowait.domaincorerdb.department.entity.Department; import com.nowait.domaincorerdb.department.repository.DepartmentRepository; @@ -38,46 +37,6 @@ public class StoreServiceImpl implements StoreService { private final StringRedisTemplate redisTemplate; - @Override - @Transactional(readOnly = true) - public StoreReadResponse getAllStores() { - 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,16 @@ 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; + return redisTemplate.opsForZSet().zCard(key); + } + )); + // 3) 각 StoreId에 해당하는 이미지 조회 List allImages = storeImageRepository.findByStore_StoreIdIn(storeIds); Map> imageMap = allImages.stream() @@ -118,7 +87,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 +110,16 @@ public StorePageReadDto getStoreByStoreId(Long storeId) { .map(Department::getName) .orElse("Unknown Department"); + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 + String key = "waiting:" + storeId; + Long waitingSize = redisTemplate.opsForZSet().zCard(key); + 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 +129,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 +143,16 @@ 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; + return redisTemplate.opsForZSet().zCard(key); + } + )); + // 3) 각 StoreId에 해당하는 이미지 조회 List allImages = storeImageRepository.findByStore_StoreIdIn(storeIds); Map> imageMap = allImages.stream() @@ -189,7 +176,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(); } From 1c943debc0e29cc080064f955e080700d2a33506 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Fri, 25 Jul 2025 12:13:20 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor(Store):=20redis=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/controller/StoreController.java | 2 +- .../store/service/StoreServiceImpl.java | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) 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 4a7e6653..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 @@ -29,7 +29,7 @@ public class StoreController { private final StoreService storeService; - @GetMapping("/all-stores/infinite-scroll") + @GetMapping("/all-stores") @Operation( summary = "모든 주점 페이지네이션 조회", description = "모든 주점을 페이지네이션으로 조회합니다." diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java index 23ba3a83..a606422a 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java @@ -59,7 +59,12 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page Function.identity(), storeId -> { String key = "waiting:" + storeId; - return redisTemplate.opsForZSet().zCard(key); + try { + return redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + return 0L; // Redis 접근 실패 시 0으로 처리 + } + } )); @@ -112,7 +117,12 @@ public StorePageReadDto getStoreByStoreId(Long storeId) { // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 String key = "waiting:" + storeId; - Long waitingSize = redisTemplate.opsForZSet().zCard(key); + Long waitingSize = 0L; + try { + redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + waitingSize = 0L; // Redis 접근 실패 시 0으로 처리 + } List images = storeImageRepository.findByStore(store); List imageDto = images.stream() @@ -149,7 +159,11 @@ public List searchByKeywordNative(String keyword) { Function.identity(), storeId -> { String key = "waiting:" + storeId; - return redisTemplate.opsForZSet().zCard(key); + try { + return redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + return 0L; // Redis 접근 실패 시 0으로 처리 + } } ));