diff --git a/src/main/java/com/souzip/domain/recommend/ai/service/AiRecommendationService.java b/src/main/java/com/souzip/domain/recommend/ai/service/AiRecommendationService.java index c933ae64..dc5f131d 100644 --- a/src/main/java/com/souzip/domain/recommend/ai/service/AiRecommendationService.java +++ b/src/main/java/com/souzip/domain/recommend/ai/service/AiRecommendationService.java @@ -72,7 +72,6 @@ public AiRecommendationResponse getCategoryRecommendationsForUser(Long userId) { log.info("추천 이름 파싱: {}", recommendedNamesByCategory); String userUuid = findUserUuid(userId); - return new AiRecommendationResponse( mapToRecommendedSouvenirs(recommendedNamesByCategory, userUuid) ); @@ -125,7 +124,7 @@ public AiRecommendationResponse getRecentSouvenirRecommendations(Long userId) { String userUuid = findUserUuid(userId); List souvenirIds = souvenirs.stream().map(Souvenir::getId).toList(); - Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserId(userUuid); + Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserUserId(userUuid); Map wishlistCountMap = wishlistRepository.countBySouvenirIds(souvenirIds); List finalSouvenirs = souvenirs.stream() @@ -217,7 +216,7 @@ private List mapToRecommendedSouve .toList(); Map thumbnailMap = getThumbnails(souvenirIds); - Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserId(userUuid); + Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserUserId(userUuid); Map wishlistCountMap = wishlistRepository.countBySouvenirIds(souvenirIds); return souvenirs.stream() diff --git a/src/main/java/com/souzip/domain/recommend/general/service/GeneralRecommendationService.java b/src/main/java/com/souzip/domain/recommend/general/service/GeneralRecommendationService.java index 4267815e..b33f5f49 100644 --- a/src/main/java/com/souzip/domain/recommend/general/service/GeneralRecommendationService.java +++ b/src/main/java/com/souzip/domain/recommend/general/service/GeneralRecommendationService.java @@ -70,7 +70,7 @@ public List getTopCountriesWithTop10Souvenirs(@Nullabl String userId = extractUserId(authorizationHeader); Set wishlistedIds = userId != null - ? wishlistRepository.findSouvenirIdsByUserId(userId) + ? wishlistRepository.findSouvenirIdsByUserUserId(userId) : Collections.emptySet(); Map wishlistCountMap = wishlistRepository.countBySouvenirIds(allSouvenirIds); @@ -116,7 +116,7 @@ private List toDto(List souvenirs, @Nullable String userId = extractUserId(authorizationHeader); Set wishlistedIds = userId != null - ? wishlistRepository.findSouvenirIdsByUserId(userId) + ? wishlistRepository.findSouvenirIdsByUserUserId(userId) : Collections.emptySet(); Map wishlistCountMap = wishlistRepository.countBySouvenirIds(souvenirIds); diff --git a/src/main/java/com/souzip/domain/souvenir/service/SouvenirService.java b/src/main/java/com/souzip/domain/souvenir/service/SouvenirService.java index 111a11a8..7437554b 100644 --- a/src/main/java/com/souzip/domain/souvenir/service/SouvenirService.java +++ b/src/main/java/com/souzip/domain/souvenir/service/SouvenirService.java @@ -56,12 +56,13 @@ public SouvenirNearbyListResponse getNearbySouvenirs( double radiusMeter, @Nullable String authorizationHeader ) { - String userId = extractUserId(authorizationHeader); + Long userId = extractUserIdAsLong(authorizationHeader); List results = souvenirRepository.findNearbySouvenirs(latitude, longitude, radiusMeter); - Set wishlistedIds = userId != null - ? wishlistRepository.findSouvenirIdsByUserId(userId) + String userUuid = userId != null ? findUserUuid(userId) : null; + Set wishlistedIds = userUuid != null + ? wishlistRepository.findSouvenirIdsByUserUserId(userUuid) : Collections.emptySet(); List list = results.stream() @@ -79,11 +80,12 @@ public SouvenirDetailResponse getSouvenir( Long souvenirId, @Nullable String authorizationHeader ) { - String userId = extractUserId(authorizationHeader); + Long userId = extractUserIdAsLong(authorizationHeader); Souvenir souvenir = findSouvenirById(souvenirId); List files = getFiles(souvenirId); - boolean isOwned = souvenir.isOwnedBy(userId); - boolean isWishlisted = userId != null && wishlistRepository.existsByUserUserIdAndSouvenirId(userId, souvenirId); + String userUuid = userId != null ? findUserUuid(userId) : null; + boolean isOwned = userId != null && souvenir.isOwnedBy(userUuid); + boolean isWishlisted = userUuid != null && wishlistRepository.existsByUserUserIdAndSouvenirId(userUuid, souvenirId); long wishlistCount = wishlistRepository.countBySouvenirId(souvenirId); PriceResponse priceResponse = createPriceResponse(souvenir); return SouvenirDetailResponse.of(souvenir, files, isOwned, isWishlisted, wishlistCount, priceResponse); @@ -220,7 +222,7 @@ private PriceResponse createPriceResponse(Souvenir souvenir) { } @Nullable - private String extractUserId(@Nullable String authorizationHeader) { + private Long extractUserIdAsLong(@Nullable String authorizationHeader) { if (hasNoAuthorizationHeader(authorizationHeader)) { return null; } @@ -235,7 +237,13 @@ private String extractUserId(@Nullable String authorizationHeader) { return null; } - return parseUserIdFromToken(token); + return parseUserIdFromTokenAsLong(token); + } + + @Nullable + private String extractUserId(@Nullable String authorizationHeader) { + Long userId = extractUserIdAsLong(authorizationHeader); + return userId != null ? String.valueOf(userId) : null; } private boolean hasNoAuthorizationHeader(String authorizationHeader) { @@ -255,16 +263,21 @@ private boolean isEmptyToken(String token) { } @Nullable - private String parseUserIdFromToken(String token) { + private Long parseUserIdFromTokenAsLong(String token) { try { - Long userId = jwtTokenProvider.getUserIdFromToken(token); - return userId != null ? String.valueOf(userId) : null; + return jwtTokenProvider.getUserIdFromToken(token); } catch (Exception e) { log.debug("Failed to parse token", e); return null; } } + private String findUserUuid(Long userId) { + return userRepository.findById(userId) + .map(User::getUserId) + .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + } + private void requireUserId(Long userId) { if (isNullUserId(userId)) { throw new BusinessException(ErrorCode.UNAUTHORIZED); diff --git a/src/main/java/com/souzip/domain/user/service/UserService.java b/src/main/java/com/souzip/domain/user/service/UserService.java index 92cb7665..d0fd2a22 100644 --- a/src/main/java/com/souzip/domain/user/service/UserService.java +++ b/src/main/java/com/souzip/domain/user/service/UserService.java @@ -119,7 +119,7 @@ public MySouvenirListResponse getMySouvenirs(Long userId, int page, int size) { .toList(); Map thumbnailMap = getThumbnails(souvenirIds); - Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserId(user.getUserId()); + Set wishlistedIds = wishlistRepository.findSouvenirIdsByUserUserId(user.getUserId()); Map wishlistCountMap = wishlistRepository.countBySouvenirIds(souvenirIds); Page responsePage = souvenirPage.map(souvenir -> { diff --git a/src/main/java/com/souzip/domain/wishlist/repository/WishlistRepository.java b/src/main/java/com/souzip/domain/wishlist/repository/WishlistRepository.java index c4de3895..99e7ec60 100644 --- a/src/main/java/com/souzip/domain/wishlist/repository/WishlistRepository.java +++ b/src/main/java/com/souzip/domain/wishlist/repository/WishlistRepository.java @@ -17,6 +17,8 @@ @Repository public interface WishlistRepository extends JpaRepository { + boolean existsByUserIdAndSouvenirId(Long userId, Long souvenirId); + boolean existsByUserUserIdAndSouvenirId(String userId, Long souvenirId); @Modifying @@ -29,8 +31,11 @@ public interface WishlistRepository extends JpaRepository { ) Page findByUserIdOrderByCreatedAtDesc(@Param("userId") Long userId, Pageable pageable); + @Query("SELECT w.souvenir.id FROM Wishlist w WHERE w.user.id = :userId") + Set findSouvenirIdsByUserId(@Param("userId") Long userId); + @Query("SELECT w.souvenir.id FROM Wishlist w WHERE w.user.userId = :userId") - Set findSouvenirIdsByUserId(@Param("userId") String userId); + Set findSouvenirIdsByUserUserId(@Param("userId") String userId); @Query("SELECT COUNT(w) FROM Wishlist w WHERE w.souvenir.id = :souvenirId") long countBySouvenirId(@Param("souvenirId") Long souvenirId);