From 76fb33369525b44d5236e2a2c7b2cfb885b72937 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 21 Aug 2025 23:28:45 +0900 Subject: [PATCH] =?UTF-8?q?refactor/#336:=20=EC=84=A4=EB=AC=B8=20=EB=A7=88?= =?UTF-8?q?=EA=B0=90=EC=9D=BC=EC=8B=9C=EC=97=90=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=EC=8B=9C=20retry=20=EC=A0=84=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 즉시 생성 시에 중복 처리 제외하도록 반영 --- .../controller/MoodTrackerController.java | 4 ++-- .../service/MoodTrackerCommandServiceImpl.java | 6 ++++++ .../haru/api/infra/redis/RedisReportConsumer.java | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java index faa5353a..ce951f98 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java +++ b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java @@ -255,7 +255,7 @@ public ApiResponse downloadLi @PostMapping("/{mood-tracker-hashed-Id}/report-test") @Operation( - summary = "분위기 트래커 설문 리포트 즉시 생성 테스트 API", + summary = "분위기 트래커 설문 리포트 즉시 생성 API", description = "# [v1.0 (2025-07-26)](https://www.notion.so/23f5da7802c58080b4a5e6d24b47d924) 해당 ID의 분위기 트래커 설문 리포트를 즉시 생성합니다." ) @Parameters({ @@ -274,7 +274,7 @@ public ApiResponse generateMoodTrackerReportTest ( @PostMapping("/{mood-tracker-hashed-Id}/report-file-thumbnail-test") @Operation( - summary = "분위기 트래커 설문 리포트, 파일, 썸네일 즉시 생성 테스트 API", + summary = "분위기 트래커 설문 리포트, 파일, 썸네일 즉시 생성 테스트 API + redis에서 제외하여 마감일시에 중복 생성 불가", description = "# [v1.0 (2025-08-14)](https://www.notion.so/24f5da7802c58019a1f7d9c8e882226e) 해당 ID의 분위기 트래커 설문 리포트를 즉시 생성합니다." ) @Parameters({ diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java index ee51f0df..fc9b30af 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java @@ -19,6 +19,7 @@ import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.global.apiPayload.exception.handler.*; import com.haru.api.global.util.HashIdUtil; +import com.haru.api.infra.redis.RedisReportConsumer; import com.haru.api.infra.redis.RedisReportProducer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,6 +53,7 @@ public class MoodTrackerCommandServiceImpl implements MoodTrackerCommandService private final MoodTrackerReportService moodTrackerReportService; private final RedisReportProducer redisReportProducer; + private final RedisReportConsumer redisReportConsumer; private final HashIdUtil hashIdUtil; @@ -318,6 +320,10 @@ public void generateReportTest( public void generateReportFileAndThumbnailTest( MoodTracker moodTracker ) { + // 중복 처리 제외 + redisReportConsumer.removeFromQueue(moodTracker.getId()); + + // 즉시 생성 moodTrackerReportService.generateAndUploadReportFileAndThumbnail(moodTracker.getId()); } } diff --git a/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java b/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java index cb149aa1..30a5a61d 100644 --- a/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java +++ b/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java @@ -44,4 +44,18 @@ public void pollQueueEvery30Minutes() { } } } + + @Transactional + public void removeFromQueue(Long moodTrackerId) { + try { + Long removed = redisTemplate.opsForZSet().remove(QUEUE_KEY, moodTrackerId.toString()); + if (removed != null && removed > 0) { + log.info("즉시 생성 API 호출로 큐에서 제거됨: {}", moodTrackerId); + } else { + log.info("큐에 존재하지 않아 제거할 항목 없음: {}", moodTrackerId); + } + } catch (Exception e) { + log.error("큐 제거 실패: {}", moodTrackerId, e); + } + } }