From 9e2f03edc1505418cd42f2a10487812416bc523a Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Tue, 29 Jul 2025 15:13:35 +0900 Subject: [PATCH] =?UTF-8?q?refactor(Bookmark):=20=EC=A3=BC=EC=A0=90=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20isBookmark=20?= =?UTF-8?q?=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 --- .../bookmark/service/BookmarkService.java | 4 +- .../store/controller/StoreController.java | 5 +- .../dto/StoreDepartmentReadResponse.java | 4 +- .../store/dto/StorePageReadResponse.java | 4 +- ...eReadDto.java => StoreSearchResponse.java} | 22 ++------- .../store/service/StoreService.java | 9 ++-- .../store/service/StoreServiceImpl.java | 46 +++++++++++++------ .../repository/BookmarkRepository.java | 4 ++ 8 files changed, 54 insertions(+), 44 deletions(-) rename nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/{StorePageReadDto.java => StoreSearchResponse.java} (58%) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java index e5fe86c8..744d5201 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java @@ -9,7 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import com.nowait.applicationuser.bookmark.dto.BookmarkCreateResponse; -import com.nowait.applicationuser.store.dto.StorePageReadDto; +import com.nowait.applicationuser.store.dto.StorePageReadResponse; import com.nowait.applicationuser.store.service.StoreService; import com.nowait.domaincorerdb.store.entity.Store; import com.nowait.domaincorerdb.store.repository.StoreRepository; @@ -52,7 +52,7 @@ public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User cust } @Transactional(readOnly = true) - public List getBookmarks(CustomOAuth2User customOAuth2User) { + public List getBookmarks(CustomOAuth2User customOAuth2User) { User user = userRepository.findById(customOAuth2User.getUserId()) .orElseThrow(UserNotFoundException::new); 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 e092e31e..e134bf28 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 @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.nowait.applicationuser.store.dto.StoreWaitingInfo; import com.nowait.applicationuser.store.service.StoreService; import com.nowait.common.api.ApiUtils; import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; @@ -37,12 +36,12 @@ public class StoreController { description = "모든 주점을 페이지네이션으로 조회합니다." ) @ApiResponse(responseCode = "200", description = "모든 주점 페이지네이션 조회 성공") - public ResponseEntity getAllStoresByPageAndDeparments(Pageable pageable) { + public ResponseEntity getAllStoresByPageAndDeparments(Pageable pageable, @AuthenticationPrincipal CustomOAuth2User customOAuth2User) { return ResponseEntity .ok() .body( ApiUtils.success( - storeService.getAllStoresByPageAndDeparments(pageable) + storeService.getAllStoresByPageAndDeparments(pageable, customOAuth2User) ) ); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreDepartmentReadResponse.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreDepartmentReadResponse.java index e052524b..7047140e 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreDepartmentReadResponse.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreDepartmentReadResponse.java @@ -11,12 +11,12 @@ @Builder public class StoreDepartmentReadResponse { - private List storePageReadDtos; + private List storePageReadResponses; private boolean hasNext; public static StoreDepartmentReadResponse of(List storePageReadResponses, boolean hasNext) { return StoreDepartmentReadResponse.builder() - .storePageReadDtos(storePageReadResponses) + .storePageReadResponses(storePageReadResponses) .hasNext(hasNext) .build(); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadResponse.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadResponse.java index 6066f75e..ccee3926 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadResponse.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StorePageReadResponse.java @@ -15,6 +15,7 @@ @Builder public class StorePageReadResponse { private Long storeId; + private Boolean isBookmark; private Long waitingCount; private Long departmentId; private String departmentName; @@ -29,7 +30,7 @@ public class StorePageReadResponse { private Boolean deleted; private LocalDateTime createdAt; - public static StorePageReadResponse fromEntity(Store store, List allImages, String departmentName, Long waitingCount) { + public static StorePageReadResponse fromEntity(Store store, List allImages, String departmentName, Long waitingCount, Boolean isBookmark) { StoreImageUploadResponse profile = allImages.stream() .filter(image -> image.getImageType() == ImageType.PROFILE) @@ -42,6 +43,7 @@ public static StorePageReadResponse fromEntity(Store store, List bannerImages; private Boolean isActive; private Boolean deleted; private LocalDateTime createdAt; - public static StorePageReadDto fromEntity(Store store, List allImages, String departmentName, Long waitingCount, Boolean isBookmark) { + public static StoreSearchResponse fromEntity(Store store, List profileImage, String departmentName, Long waitingCount) { - StoreImageUploadResponse profile = allImages.stream() + StoreImageUploadResponse profile = profileImage.stream() .filter(image -> image.getImageType() == ImageType.PROFILE) .findFirst() .orElse(null); - List banners = allImages.stream() - .filter(image -> image.getImageType() == ImageType.BANNER) - .toList(); - - return StorePageReadDto.builder() + return StoreSearchResponse.builder() .storeId(store.getStoreId()) - .isBookmark(isBookmark) .waitingCount(waitingCount) .departmentId(store.getDepartmentId()) .departmentName(departmentName) .name(store.getName()) - .location(store.getLocation()) - .description(store.getDescription()) - .notice(store.getNotice()) .openTime(store.getOpenTime()) .profileImage(profile) - .bannerImages(banners) .isActive(store.getIsActive()) .deleted(store.getDeleted()) .createdAt(store.getCreatedAt()) 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 7900d032..873d713b 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 @@ -7,20 +7,21 @@ import com.nowait.applicationuser.store.dto.StoreDepartmentReadResponse; import com.nowait.applicationuser.store.dto.StoreDetailReadResponse; -import com.nowait.applicationuser.store.dto.StorePageReadDto; import com.nowait.applicationuser.store.dto.StorePageReadResponse; +import com.nowait.applicationuser.store.dto.StoreSearchResponse; import com.nowait.applicationuser.store.dto.StoreWaitingInfo; +import com.nowait.domaincorerdb.user.entity.MemberDetails; import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; public interface StoreService { - StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable); + StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable, CustomOAuth2User customOAuth2User); StoreDetailReadResponse getStoreByStoreId(Long storeId, CustomOAuth2User customOAuth2User); - List searchByKeywordNative(String name); + List searchByKeywordNative(String name); List getStoresByWaitingCount(boolean desc); - List getAllStoresByPageAndDeparments(List storeIds, Set bookmarkedSet); + List getAllStoresByPageAndDeparments(List storeIds, Set bookmarkedSet); } 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 4743feb2..c02b2259 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.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -24,8 +25,8 @@ import com.nowait.applicationuser.store.dto.StoreDepartmentReadResponse; import com.nowait.applicationuser.store.dto.StoreDetailReadResponse; import com.nowait.applicationuser.store.dto.StoreImageUploadResponse; -import com.nowait.applicationuser.store.dto.StorePageReadDto; import com.nowait.applicationuser.store.dto.StorePageReadResponse; +import com.nowait.applicationuser.store.dto.StoreSearchResponse; import com.nowait.applicationuser.store.dto.StoreWaitingInfo; import com.nowait.domaincorerdb.department.entity.Department; import com.nowait.domaincorerdb.department.repository.DepartmentRepository; @@ -40,6 +41,7 @@ import com.nowait.domaincorerdb.user.exception.UserNotFoundException; import com.nowait.domaincorerdb.user.repository.UserRepository; import com.nowait.domaincoreredis.common.util.RedisKeyUtils; +import com.nowait.domainuserrdb.bookmark.entity.Bookmark; import com.nowait.domainuserrdb.bookmark.repository.BookmarkRepository; import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User; @@ -59,7 +61,10 @@ public class StoreServiceImpl implements StoreService { @Override @Transactional(readOnly = true) - public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable) { + public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable, CustomOAuth2User customOAuth2User) { + + User user = customOAuth2User.getUser(); + // 1) 페이징된 Store 스냅샷 조회 Slice slice = storeRepository.findAllByDeletedFalseOrderByStoreIdAsc(pageable); List stores = slice.getContent(); @@ -73,6 +78,14 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page .distinct() .toList(); + // 2) 사용자 북마크된 storeId 집합 조회 + List storeBookmarkIds = bookmarkRepository.findAllByUser(user) + .stream() + .map(Bookmark::getStore) + .map(Store::getStoreId) + .toList(); + Set bookmarkedSet = new HashSet<>(storeIds); + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 Map waitingSizeMap = storeIds.stream() .collect(Collectors.toMap( @@ -105,16 +118,21 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page Department::getName )); + List allBookmarks = bookmarkRepository.findStoreIdByUser(user); + Map bookmarkMap = allBookmarks.stream() + .collect(Collectors.toMap( + bookmark -> bookmark.getStore().getStoreId(), + b -> Boolean.TRUE + )); + // 5) Dto 매핑 List content = stores.stream() .map(store -> { - List imgs = imageMap - .getOrDefault(store.getStoreId(), List.of()); - String departmentName = deptNameMap - .getOrDefault(store.getDepartmentId(), "Unknown Department"); - Long waitingCount = - waitingSizeMap.getOrDefault(store.getStoreId(), 0L); - return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount); + List imgs = imageMap.getOrDefault(store.getStoreId(), List.of()); + String departmentName = deptNameMap.getOrDefault(store.getDepartmentId(), "Unknown Department"); + Long waitingCount = waitingSizeMap.getOrDefault(store.getStoreId(), 0L); + Boolean isBookmark = bookmarkMap.getOrDefault(store.getStoreId(), false); + return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount, isBookmark); }) .toList(); @@ -153,7 +171,7 @@ public StoreDetailReadResponse getStoreByStoreId(Long storeId, CustomOAuth2User } @Override - public List searchByKeywordNative(String keyword) { + public List searchByKeywordNative(String keyword) { if (keyword == null || keyword.isBlank()) { throw new StoreParamEmptyException(); } @@ -210,7 +228,7 @@ public List searchByKeywordNative(String keyword) { .getOrDefault(store.getDepartmentId(), "Unknown Department"); Long waitingCount = waitingSizeMap.getOrDefault(store.getStoreId(), 0L); - return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount); + return StoreSearchResponse.fromEntity(store, imgs, departmentName, waitingCount); }) .toList(); } @@ -285,7 +303,7 @@ private RedisConnection getSafeConnection() { @Override @Transactional(readOnly = true) - public List getAllStoresByPageAndDeparments(List storeIds, Set bookmarkedSet) { + public List getAllStoresByPageAndDeparments(List storeIds, Set bookmarkedSet) { // 1) 페이징된 Store 스냅샷 조회 List stores = storeRepository.findAllByStoreIdInOrderByStoreIdAsc(storeIds); @@ -328,7 +346,7 @@ public List getAllStoresByPageAndDeparments(List storeId )); // 5) Dto 매핑 - List content = stores.stream() + List content = stores.stream() .map(store -> { List imgs = imageMap .getOrDefault(store.getStoreId(), List.of()); @@ -338,7 +356,7 @@ public List getAllStoresByPageAndDeparments(List storeId waitingSizeMap.getOrDefault(store.getStoreId(), 0L); boolean isBookmark = bookmarkedSet.contains(store.getStoreId()); - return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount, isBookmark); + return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount, isBookmark); }) .toList(); diff --git a/nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/repository/BookmarkRepository.java b/nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/repository/BookmarkRepository.java index 69526299..dd27e0c9 100644 --- a/nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/repository/BookmarkRepository.java +++ b/nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/repository/BookmarkRepository.java @@ -1,6 +1,8 @@ package com.nowait.domainuserrdb.bookmark.repository; +import java.awt.print.Book; import java.util.Collection; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -14,4 +16,6 @@ public interface BookmarkRepository extends JpaRepository { boolean existsByUserAndStore(User user, Store store); Collection findAllByUser(User user); + + List findStoreIdByUser(User user); }