diff --git a/src/main/java/com/example/nexus/app/review/dto/ReviewResponse.java b/src/main/java/com/example/nexus/app/review/dto/ReviewResponse.java index c480cac..3075ea3 100644 --- a/src/main/java/com/example/nexus/app/review/dto/ReviewResponse.java +++ b/src/main/java/com/example/nexus/app/review/dto/ReviewResponse.java @@ -17,6 +17,8 @@ public class ReviewResponse { private String content; private LocalDateTime createdAt; private LocalDateTime updatedAt; + // 답변 완료 여부 + private Boolean hasReply; // 작성자 정보 (내부 클래스로 구성) private WriterInfo writer; diff --git a/src/main/java/com/example/nexus/app/review/repository/ReviewReplyRepository.java b/src/main/java/com/example/nexus/app/review/repository/ReviewReplyRepository.java index a0fe8f3..33c5dc6 100644 --- a/src/main/java/com/example/nexus/app/review/repository/ReviewReplyRepository.java +++ b/src/main/java/com/example/nexus/app/review/repository/ReviewReplyRepository.java @@ -32,5 +32,8 @@ public interface ReviewReplyRepository extends JpaRepository Page findByCreatedByOrderByCreatedAtDesc(@Param("userId") Long userId, Pageable pageable); Long countByReviewId(Long reviewId); + + @Query("SELECT rr.review.id, COUNT(rr) FROM ReviewReply rr WHERE rr.review.id IN :reviewIds GROUP BY rr.review.id") + List countByReviewIds(@Param("reviewIds") List reviewIds); } diff --git a/src/main/java/com/example/nexus/app/review/service/ReviewService.java b/src/main/java/com/example/nexus/app/review/service/ReviewService.java index bda2544..4f5a316 100644 --- a/src/main/java/com/example/nexus/app/review/service/ReviewService.java +++ b/src/main/java/com/example/nexus/app/review/service/ReviewService.java @@ -104,10 +104,31 @@ public ReviewResponse getReview(Long reviewId) { @Transactional(readOnly = true) public List getReviewsByPostId(Long postId) { - return reviewRepository - .findByPostId(postId) - .stream() - .map(this::toReviewResponse) + List reviews = reviewRepository.findByPostId(postId); + + List reviewIds = reviews.stream() + .map(Review::getId) + .collect(Collectors.toList()); + + // 리뷰 ID별 답글 개수 Map 생성 + java.util.Map replyCountMap = java.util.Collections.emptyMap(); + if (!reviewIds.isEmpty()) { + replyCountMap = reviewReplyRepository.countByReviewIds(reviewIds) + .stream() + .collect(Collectors.toMap( + result -> ((Number) result[0]).longValue(), + result -> ((Number) result[1]).longValue() + )); + } + + final java.util.Map finalReplyCountMap = replyCountMap; + + return reviews.stream() + .map(review -> { + boolean hasReply = finalReplyCountMap.containsKey(review.getId()) + && finalReplyCountMap.get(review.getId()) > 0; + return toReviewResponse(review, hasReply); + }) .collect(Collectors.toList()); } @@ -239,6 +260,10 @@ public ReviewStatusResponse getReviewStatus(Long userId, Long postId) { } private ReviewResponse toReviewResponse(Review review) { + return toReviewResponse(review, false); + } + + private ReviewResponse toReviewResponse(Review review, boolean hasReply) { User createdBy = review.getCreatedBy(); return ReviewResponse.builder() @@ -248,6 +273,7 @@ private ReviewResponse toReviewResponse(Review review) { .content(review.getContent()) .createdAt(review.getCreatedAt()) .updatedAt(review.getUpdatedAt()) + .hasReply(hasReply) .writer(ReviewResponse.WriterInfo.builder() .id(createdBy.getId()) .nickname(createdBy.getNickname() != null ? createdBy.getNickname() : "")