From 469795bf3e583610122d8ce56141e80bb350c64d Mon Sep 17 00:00:00 2001 From: Develop-KIM Date: Tue, 30 Jun 2026 14:39:32 +0900 Subject: [PATCH] =?UTF-8?q?fix(mission):=20=EC=A3=BC=EA=B0=84=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20KST=20=EC=A3=BC=EC=B0=A8=20=EA=B2=BD=EA=B3=84?= =?UTF-8?q?=EB=A5=BC=20ServiceTime=EC=9C=BC=EB=A1=9C=20UTC=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드리뷰(#266) 반영: - MissionScheduler 연속주차 실패 판정: LocalDate.now()/raw 경계 → ServiceTime.today() KST 주차 + startOfDayUtc 배타적 경계로 쿼리 - MissionQueryService 주간 현황: from/to를 ServiceTime UTC로, completedAt은 toServiceDate(KST)로 변환해 00:00~08:59 KST 완료분 누락 방지 Co-Authored-By: Claude Opus 4.8 --- .../integration/scheduler/MissionScheduler.kt | 11 ++++------- .../application/achievement/MissionQueryService.kt | 14 ++++++-------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/com/didit/adapter/integration/scheduler/MissionScheduler.kt b/src/main/kotlin/com/didit/adapter/integration/scheduler/MissionScheduler.kt index 13506a9a..5f78223b 100644 --- a/src/main/kotlin/com/didit/adapter/integration/scheduler/MissionScheduler.kt +++ b/src/main/kotlin/com/didit/adapter/integration/scheduler/MissionScheduler.kt @@ -3,13 +3,11 @@ package com.didit.adapter.integration.scheduler import com.didit.application.achievement.required.MissionRepository import com.didit.application.achievement.required.UserMissionRepository import com.didit.application.retrospect.required.RetrospectiveRepository +import com.didit.domain.shared.ServiceTime import jakarta.transaction.Transactional import org.slf4j.LoggerFactory import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.LocalTime import java.time.temporal.TemporalAdjusters @Component @@ -42,14 +40,13 @@ class MissionScheduler( consecutiveWeekMissions.forEach { userMission -> val lastWeekStart = - LocalDate.now().with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY)).minusWeeks(1) - val lastWeekEnd = lastWeekStart.plusDays(6) + ServiceTime.today().with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY)).minusWeeks(1) val lastWeekRetroCount = retrospectiveRepository.countCompletedByUserIdAndPeriod( userId = userMission.userId, - from = LocalDateTime.of(lastWeekStart, LocalTime.MIDNIGHT), - to = LocalDateTime.of(lastWeekEnd, LocalTime.of(23, 59, 59)), + from = ServiceTime.startOfDayUtc(lastWeekStart), + to = ServiceTime.startOfDayUtc(lastWeekStart.plusWeeks(1)), ) if (lastWeekRetroCount == 0) { diff --git a/src/main/kotlin/com/didit/application/achievement/MissionQueryService.kt b/src/main/kotlin/com/didit/application/achievement/MissionQueryService.kt index 33cda84d..f7189df2 100644 --- a/src/main/kotlin/com/didit/application/achievement/MissionQueryService.kt +++ b/src/main/kotlin/com/didit/application/achievement/MissionQueryService.kt @@ -16,12 +16,11 @@ import com.didit.domain.achievement.Mission import com.didit.domain.achievement.MissionStatus import com.didit.domain.achievement.MissionType import com.didit.domain.achievement.UserMission +import com.didit.domain.shared.ServiceTime import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.time.DayOfWeek import java.time.LocalDate -import java.time.LocalDateTime -import java.time.LocalTime import java.time.temporal.TemporalAdjusters import java.util.UUID @@ -89,15 +88,14 @@ class MissionQueryService( return null } - val weekStartDate = getWeekStartDate(LocalDate.now()) - val weekEndDate = weekStartDate.plusDays(6) - val from = LocalDateTime.of(weekStartDate, LocalTime.MIDNIGHT) - val to = LocalDateTime.of(weekEndDate, LocalTime.of(23, 59, 59)) + val weekStartDate = getWeekStartDate(ServiceTime.today()) + val from = ServiceTime.startOfDayUtc(weekStartDate) + val to = ServiceTime.startOfDayUtc(weekStartDate.plusWeeks(1)) val completedRetros = retrospectiveRepository.findCompletedByUserIdAndPeriod(userId, from, to) - val completedDates = completedRetros.map { it.completedAt?.toLocalDate() }.toSet() + val completedDates = completedRetros.mapNotNull { it.completedAt?.let(ServiceTime::toServiceDate) }.toSet() - val today = LocalDate.now() + val today = ServiceTime.today() val days = mutableListOf() for (i in 0..6) {