From 7d880f552a6a68eca481bfaeebba8fe0963fb869 Mon Sep 17 00:00:00 2001 From: UNGGU0704 Date: Wed, 18 Jun 2025 10:01:46 +0900 Subject: [PATCH] =?UTF-8?q?Update:=20kakao=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExternalReviewEventHubAdapter.java | 24 ++++++++++++++++--- .../repository/ReviewJpaRepository.java | 10 +++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/review/src/main/java/com/ktds/hi/review/infra/gateway/ExternalReviewEventHubAdapter.java b/review/src/main/java/com/ktds/hi/review/infra/gateway/ExternalReviewEventHubAdapter.java index 4b45bc7..bec9711 100644 --- a/review/src/main/java/com/ktds/hi/review/infra/gateway/ExternalReviewEventHubAdapter.java +++ b/review/src/main/java/com/ktds/hi/review/infra/gateway/ExternalReviewEventHubAdapter.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.ktds.hi.review.biz.domain.Review; import com.ktds.hi.review.biz.domain.ReviewStatus; import com.ktds.hi.review.biz.usecase.out.ReviewRepository; +import com.ktds.hi.review.infra.gateway.repository.ReviewJpaRepository; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; @@ -33,7 +34,7 @@ public class ExternalReviewEventHubAdapter { @Qualifier("externalReviewEventConsumer") private final EventHubConsumerClient externalReviewEventConsumer; - + private final ReviewJpaRepository reviewJpaRepository; private final ObjectMapper objectMapper; private final ReviewRepository reviewRepository; @@ -119,10 +120,21 @@ public class ExternalReviewEventHubAdapter { String platform = (String) event.get("platform"); Integer syncedCount = (Integer) event.get("syncedCount"); + // Store에서 발행하는 reviews 배열 처리 @SuppressWarnings("unchecked") List> reviews = (List>) event.get("reviews"); + if (reviews != null) { + for (int i = 0; i < reviews.size(); i++) { + Map review = reviews.get(i); + log.info("Review[{}]: {}", i, review); + } + } else { + log.info("No reviews found in event."); + } + + if (reviews == null || reviews.isEmpty()) { log.warn("리뷰 데이터가 없습니다: platform={}, storeId={}", platform, storeId); return; @@ -157,16 +169,22 @@ public class ExternalReviewEventHubAdapter { */ private Review saveExternalReview(Long storeId, String platform, Map reviewData) { try { + String nickname = createMemberNickname(platform, reviewData); // ✅ 단순화된 매핑 + if (reviewJpaRepository.existsByStoreIdAndExternalNickname(storeId, nickname)) { + log.info("중복 리뷰 스킵: storeId={}, nickname={}", storeId, nickname); + return null; + } + Review review = Review.builder() .storeId(storeId) - .memberId(null) // 외부 리뷰는 회원 ID 없음 + .memberId(-1L) .memberNickname(createMemberNickname(platform, reviewData)) .rating(extractRating(reviewData)) .content(extractContent(reviewData)) .imageUrls(new ArrayList<>()) // 외부 리뷰는 이미지 없음 .status(ReviewStatus.ACTIVE) - .likeCount(0) // ✅ 고정값 0 + .likeCount(0) .dislikeCount(0) .build(); diff --git a/review/src/main/java/com/ktds/hi/review/infra/gateway/repository/ReviewJpaRepository.java b/review/src/main/java/com/ktds/hi/review/infra/gateway/repository/ReviewJpaRepository.java index 7cf0d70..f090175 100644 --- a/review/src/main/java/com/ktds/hi/review/infra/gateway/repository/ReviewJpaRepository.java +++ b/review/src/main/java/com/ktds/hi/review/infra/gateway/repository/ReviewJpaRepository.java @@ -5,6 +5,8 @@ import com.ktds.hi.review.infra.gateway.entity.ReviewEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -30,9 +32,11 @@ public interface ReviewJpaRepository extends JpaRepository { * 리뷰 ID와 회원 ID로 리뷰 조회 */ Optional findByIdAndMemberId(Long id, Long memberId); - + + /** - * 매장 ID와 회원 ID로 리뷰 존재 여부 확인 + * 닉네임으로 외부 리뷰 중복 체크 */ - boolean existsByStoreIdAndMemberId(Long storeId, Long memberId); + @Query("SELECT COUNT(r) > 0 FROM ReviewEntity r WHERE r.storeId = :storeId AND r.memberId = -1 AND r.memberNickname = :nickname") + boolean existsByStoreIdAndExternalNickname(@Param("storeId") Long storeId, @Param("nickname") String nickname); }