From c8bb158d5c9dfb8b2a1e0011f5459974b48dfe07 Mon Sep 17 00:00:00 2001 From: Willy Date: Sat, 31 May 2025 03:35:12 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[FEAT]=20=EC=8A=A4=EC=BC=80=EC=A5=B4?= =?UTF-8?q?=EB=A7=81=EC=9D=84=20=EC=9C=84=ED=95=9C=20EnableScheduling=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/terning/TerningApplication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/terning/TerningApplication.java b/src/main/java/org/terning/TerningApplication.java index 0a63881..d5014da 100644 --- a/src/main/java/org/terning/TerningApplication.java +++ b/src/main/java/org/terning/TerningApplication.java @@ -1,15 +1,15 @@ package org.terning; -import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableScheduling; import org.terning.user.config.FcmProperties; @SpringBootApplication -@EnableBatchProcessing @EnableJpaAuditing +@EnableScheduling @EnableConfigurationProperties(FcmProperties.class) public class TerningApplication { From 2ba794c884bed3ab31a51ccf536ce293fc7e027d Mon Sep 17 00:00:00 2001 From: Willy Date: Sat, 31 May 2025 03:36:41 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[CHORE]=20RestTemplate=20Bean=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/terning/config/RestTemplateConfig.java | 14 ++++++++++++++ .../java/org/terning/TerningApplicationTests.java | 13 ------------- 2 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/terning/config/RestTemplateConfig.java delete mode 100644 src/test/java/org/terning/TerningApplicationTests.java diff --git a/src/main/java/org/terning/config/RestTemplateConfig.java b/src/main/java/org/terning/config/RestTemplateConfig.java new file mode 100644 index 0000000..70913a9 --- /dev/null +++ b/src/main/java/org/terning/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package org.terning.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/src/test/java/org/terning/TerningApplicationTests.java b/src/test/java/org/terning/TerningApplicationTests.java deleted file mode 100644 index 1b526aa..0000000 --- a/src/test/java/org/terning/TerningApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.terning; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class TerningApplicationTests { - - @Test - void contextLoads() { - } - -} From 035ce80fb66adb95197af466ecc99962f5866f4d Mon Sep 17 00:00:00 2001 From: Willy Date: Sat, 31 May 2025 03:37:03 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[FEAT]=20=ED=91=B8=EC=8B=9C=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=9E=90=EB=8F=99=ED=99=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fcm/application/FcmPushScheduler.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/main/java/org/terning/fcm/application/FcmPushScheduler.java diff --git a/src/main/java/org/terning/fcm/application/FcmPushScheduler.java b/src/main/java/org/terning/fcm/application/FcmPushScheduler.java new file mode 100644 index 0000000..860e3fa --- /dev/null +++ b/src/main/java/org/terning/fcm/application/FcmPushScheduler.java @@ -0,0 +1,103 @@ +package org.terning.fcm.application; + +import java.util.HashMap; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@RequiredArgsConstructor +@Slf4j +public class FcmPushScheduler { + + private final RestTemplate restTemplate; + + private static final String BASE_URL = "http://13.209.210.3/api/v1"; +// private static final String LOCAL_URL = "http://localhost:8081/api/v1"; + + private void callPost(String path) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>(headers); + + String url = BASE_URL + path; + try { + restTemplate.postForEntity(url, entity, String.class); + log.info("POST 요청 성공: {}", url); + } catch (Exception e) { + log.error("POST 요청 실패: {}", url, e); + } + } + + private void callPost(String path, String template) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + Map bM = new HashMap<>(); + bM.put("template", template); + + HttpEntity> entity = new HttpEntity<>(bM, headers); + String url = BASE_URL + path; + + try { + restTemplate.postForEntity(url, entity, String.class); + log.info("POST 요청 성공: {}", url); + } catch (Exception e) { + log.error("POST 요청 실패: {}", url, e); + } + } + + private void callGet(String path) { + String url = BASE_URL + path; + try { + restTemplate.getForEntity(url, String.class); + log.info("GET 요청 성공: {}", url); + } catch (Exception e) { + log.error("GET 요청 실패: {}", url, e); + } + } + + // 1. 매주 월/수 16:58 스크랩 동기화 + @Scheduled(cron = "0 58 16 ? * MON,WED", zone = "Asia/Seoul") + public void syncScraps() { + callGet("/external/scraps/sync"); + } + + // 1-2. 매주 월/수 17:00 관심공고 알림 생성 + 전송 + @Scheduled(cron = "0 0 17 ? * MON,WED", zone = "Asia/Seoul") + public void sendInterestedAnnouncementReminder() { + callPost("/notification/create", "INTERESTED_ANNOUNCEMENT_REMINDER"); + callPost("/push-notifications/send-all"); + } + + // 2. 매주 목/토 13:00 최근 공고 알림 생성 + 전송 + @Scheduled(cron = "0 0 13 ? * THU,SAT", zone = "Asia/Seoul") + public void sendRecentlyPostedInternshipRecommendation() { + callPost("/notification/create", "RECENTLY_POSTED_INTERNSHIP_RECOMMENDATION"); + callPost("/push-notifications/send-all"); + } + + // 3. 매주 일요일 21:00 인기 공고 알림 생성 + 전송 + @Scheduled(cron = "0 0 21 ? * SUN", zone = "Asia/Seoul") + public void sendTrendingInternshipAlert() { + callPost("/notification/create", "TRENDING_INTERNSHIP_ALERT"); + callPost("/push-notifications/send-all"); + } + + // 테스트용 +// @Scheduled(cron = "0 34 3 * * ?", zone = "Asia/Seoul") +// public void testPush() { +// log.info("테스트 푸시 시작"); +// +// callPost("/notification/create", "RECENTLY_POSTED_INTERNSHIP_RECOMMENDATION"); +// callPost("/push-notifications/send-all"); +// +// log.info("테스트 푸시 완료"); +// } +} From 6cf838b931efd43aa95da6e0e9216bb2d46fe34a Mon Sep 17 00:00:00 2001 From: Willy Date: Sat, 31 May 2025 03:46:28 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[CHORE]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/fcm/application/FcmPushScheduler.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/org/terning/fcm/application/FcmPushScheduler.java b/src/main/java/org/terning/fcm/application/FcmPushScheduler.java index 860e3fa..7bbd5df 100644 --- a/src/main/java/org/terning/fcm/application/FcmPushScheduler.java +++ b/src/main/java/org/terning/fcm/application/FcmPushScheduler.java @@ -19,7 +19,6 @@ public class FcmPushScheduler { private final RestTemplate restTemplate; private static final String BASE_URL = "http://13.209.210.3/api/v1"; -// private static final String LOCAL_URL = "http://localhost:8081/api/v1"; private void callPost(String path) { HttpHeaders headers = new HttpHeaders(); @@ -89,15 +88,4 @@ public void sendTrendingInternshipAlert() { callPost("/notification/create", "TRENDING_INTERNSHIP_ALERT"); callPost("/push-notifications/send-all"); } - - // 테스트용 -// @Scheduled(cron = "0 34 3 * * ?", zone = "Asia/Seoul") -// public void testPush() { -// log.info("테스트 푸시 시작"); -// -// callPost("/notification/create", "RECENTLY_POSTED_INTERNSHIP_RECOMMENDATION"); -// callPost("/push-notifications/send-all"); -// -// log.info("테스트 푸시 완료"); -// } }