From 3c644e0d3e3a4084b25976212976c2912dbaa34a Mon Sep 17 00:00:00 2001 From: JunbeomKoreaUniv Date: Sun, 6 Jul 2025 16:43:37 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EC=A4=80=EB=B9=84=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80/=EC=88=98=EC=A0=95=20=ED=95=98?= =?UTF-8?q?=EB=8A=94=20API=ED=98=B8=EC=B6=9C=20=EC=8B=9C=20=EC=95=BD?= =?UTF-8?q?=EC=86=8D=EC=95=8C=EB=A6=BC=EC=8B=9C=EA=B0=84=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=EB=90=98=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ontime-back/build.gradle | 1 + .../entity/NotificationSchedule.java | 4 ++++ .../service/PreparationScheduleService.java | 19 +++++++++++++++++-- .../ontime_back/service/ScheduleService.java | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ontime-back/build.gradle b/ontime-back/build.gradle index e03bc4c..52a235b 100644 --- a/ontime-back/build.gradle +++ b/ontime-back/build.gradle @@ -36,6 +36,7 @@ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' + implementation 'mysql:mysql-connector-java:8.0.33' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java b/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java index 23b2bed..caece98 100644 --- a/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java +++ b/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java @@ -52,4 +52,8 @@ public void markAsUnsent() { public void disconnectSchedule() { this.schedule = null; } + + public void changeNotificationTime(LocalDateTime notificationTime) { + this.notificationTime = notificationTime; + } } diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java index e80c4cf..c0495a4 100644 --- a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java +++ b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java @@ -1,9 +1,12 @@ package devkor.ontime_back.service; import devkor.ontime_back.dto.PreparationDto; +import devkor.ontime_back.entity.NotificationSchedule; import devkor.ontime_back.entity.PreparationSchedule; import devkor.ontime_back.entity.Schedule; +import devkor.ontime_back.entity.User; import devkor.ontime_back.global.jwt.JwtTokenProvider; +import devkor.ontime_back.repository.NotificationScheduleRepository; import devkor.ontime_back.repository.PreparationScheduleRepository; import devkor.ontime_back.repository.ScheduleRepository; import devkor.ontime_back.repository.UserRepository; @@ -13,24 +16,26 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; -import static devkor.ontime_back.response.ErrorCode.SCHEDULE_NOT_FOUND; -import static devkor.ontime_back.response.ErrorCode.UNAUTHORIZED_ACCESS; +import static devkor.ontime_back.response.ErrorCode.*; @Service @Transactional(readOnly = true) @RequiredArgsConstructor @Slf4j public class PreparationScheduleService { + private final ScheduleService scheduleService; private final PreparationScheduleRepository preparationScheduleRepository; private final UserRepository userRepository; private final ScheduleRepository scheduleRepository; private final JwtTokenProvider jwtTokenProvider; + private final NotificationScheduleRepository notificationScheduleRepository; @Transactional @@ -87,5 +92,15 @@ protected void handlePreparationSchedules(Long userId, UUID scheduleId, List
 new GeneralException(NOTIFICATION_NOT_FOUND));
+
+        LocalDateTime notificationTime = scheduleService.getNotificationTime(schedule, schedule.getUser());
+        log.info("Notification Time(변경된): " + notificationTime);
+
+        notification.changeNotificationTime(notificationTime);
+
+        notificationScheduleRepository.save(notification);
     }
 }
diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java b/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
index 688ee85..f72c28f 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
@@ -141,7 +141,7 @@ public void addSchedule(ScheduleAddDto scheduleAddDto, Long userId) {
         notificationService.scheduleReminder(notification);
     }
 
-    private LocalDateTime getNotificationTime(Schedule schedule, User user) {
+    public LocalDateTime getNotificationTime(Schedule schedule, User user) {
         Integer preparationTime = calculatePreparationTime(schedule, user);
         Integer moveTime = schedule.getMoveTime();
         Integer spareTime = schedule.getScheduleSpareTime() == null ? user.getSpareTime() : schedule.getScheduleSpareTime();

From 0426ec94d166e7aa8234474a7c5a1ad77e5d72c3 Mon Sep 17 00:00:00 2001
From: JunbeomKoreaUniv 
Date: Sun, 6 Jul 2025 17:23:08 +0900
Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=EC=A4=80=EB=B9=84=EA=B3=BC?=
 =?UTF-8?q?=EC=A0=95=20=EC=83=9D=EC=84=B1/=EC=88=98=EC=A0=95=EC=8B=9C=20Ta?=
 =?UTF-8?q?skScheduler=EC=9D=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=20=EC=97=85?=
 =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=EB=90=98=EA=B2=8C=20=EC=88=98?=
 =?UTF-8?q?=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/devkor/ontime_back/entity/NotificationSchedule.java  | 4 ----
 .../java/devkor/ontime_back/service/NotificationService.java  | 3 ++-
 .../ontime_back/service/PreparationScheduleService.java       | 4 +---
 .../main/java/devkor/ontime_back/service/ScheduleService.java | 2 +-
 4 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java b/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java
index caece98..23b2bed 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/entity/NotificationSchedule.java
@@ -52,8 +52,4 @@ public void markAsUnsent() {
     public void disconnectSchedule() {
         this.schedule = null;
     }
-
-    public void changeNotificationTime(LocalDateTime notificationTime) {
-        this.notificationTime = notificationTime;
-    }
 }
diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
index 2b62d74..df36351 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
@@ -68,7 +68,8 @@ public void sendReminder(NotificationSchedule notificationSchedule, String messa
 
         if (userId != null) {
             UserSetting userSetting = userSettingRepository.findByUserId(userId)
-                    .orElseThrow(() -> new IllegalArgumentException("No UserSetting found in schedule's user"));// Repository 메서드 가정
+                    .orElseThrow(() -> new IllegalArgumentException("No UserSetting found in schedule's user"));
+            log.debug("사용자 알림 전송 설정 여부: " + userSetting.getIsNotificationsEnabled());
 
             if (Boolean.TRUE.equals(userSetting.getIsNotificationsEnabled())) {
                 sendNotificationToUser(notificationSchedule.getSchedule(), message);
diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java
index c0495a4..bfdeae1 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java
@@ -99,8 +99,6 @@ protected void handlePreparationSchedules(Long userId, UUID scheduleId, List
Date: Sun, 6 Jul 2025 17:39:38 +0900
Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=EC=8A=A4?=
 =?UTF-8?q?=EC=BC=80=EC=A4=84=EB=9F=AC=EC=AA=BD=20=EC=BD=94=EB=93=9C=20?=
 =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=B4=20?=
 =?UTF-8?q?=EA=B9=A8=EC=A7=80=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?=
 =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../PreparationScheduleServiceTest.java       | 31 +++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java b/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
index 76d4344..4e4fd9c 100644
--- a/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
+++ b/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
@@ -37,6 +37,9 @@ public class PreparationScheduleServiceTest {
     @Autowired
     private UserRepository userRepository;
 
+    @Autowired
+    private NotificationScheduleRepository notificationScheduleRepository;
+
     @Autowired
     private PreparationScheduleService preparationScheduleService;
 
@@ -63,6 +66,7 @@ void makePreparationSchedules_withoutDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -83,6 +87,12 @@ void makePreparationSchedules_withoutDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         UUID preparationSchedule1Id = UUID.randomUUID();
         UUID preparationSchedule2Id = UUID.randomUUID();
 
@@ -112,6 +122,7 @@ void updatePreparationSchedules_withDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -132,6 +143,12 @@ void updatePreparationSchedules_withDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         PreparationSchedule preparationSchedule3 = preparationScheduleRepository.save(new PreparationSchedule(
                 UUID.randomUUID(), addedSchedule1, "화장", 10, null));
         PreparationSchedule preparationSchedule2= preparationScheduleRepository.save(new PreparationSchedule(
@@ -168,6 +185,7 @@ void handlePreparationSchedules_withoutDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -188,6 +206,12 @@ void handlePreparationSchedules_withoutDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         UUID preparationSchedule1Id = UUID.randomUUID();
         UUID preparationSchedule2Id = UUID.randomUUID();
 
@@ -217,6 +241,7 @@ void handlePreparationSchedules_withDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -237,6 +262,12 @@ void handlePreparationSchedules_withDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         PreparationSchedule preparationSchedule3 = preparationScheduleRepository.save(new PreparationSchedule(
                 UUID.randomUUID(), addedSchedule1, "화장", 10, null));
         PreparationSchedule preparationSchedule2= preparationScheduleRepository.save(new PreparationSchedule(

From f2a7c708b831958d913aa7532c54afae9631a8fb Mon Sep 17 00:00:00 2001
From: JunbeomKoreaUniv 
Date: Sun, 6 Jul 2025 17:43:12 +0900
Subject: [PATCH 4/4] =?UTF-8?q?chore:=20=EC=A4=80=EB=B9=84=20=EC=8B=9C?=
 =?UTF-8?q?=EC=9E=91=20=EB=A9=98=ED=8A=B8=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/devkor/ontime_back/service/NotificationService.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
index df36351..de2c947 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java
@@ -43,7 +43,7 @@ public void scheduleReminder(NotificationSchedule notificationSchedule) {
         }
 
         ScheduledFuture future = taskScheduler.schedule(
-                () -> sendReminder(notificationSchedule, "약속 5분 전입니다"),
+                () -> sendReminder(notificationSchedule, "준비 시작해야 합니다.(현재 시각: 약속시각 - (여유시간 + 이동시간 + 총준비시간) )"),
                 Date.from(reminderTime.atZone(ZoneId.systemDefault()).toInstant())
         );