From cc5227d04edac058be1618b752c1e75efc56b464 Mon Sep 17 00:00:00 2001 From: siyeonSon Date: Thu, 9 May 2024 14:57:23 +0900 Subject: [PATCH 1/2] :sparkles: feat(batch): recommend music based on real time weather --- backend/streetdrop-batch/build.gradle | 11 ++++++++ .../com/depromeet/config/FeignConfig.java | 11 ++++++++ .../weather/jobs/RealTimeWeatherJob.java | 17 +++++++++++ .../domains/weather/response/dto/BodyDto.java | 10 +++++++ .../weather/response/dto/HeaderDto.java | 7 +++++ .../domains/weather/response/dto/ItemDto.java | 11 ++++++++ .../weather/response/dto/ItemsDto.java | 8 ++++++ .../weather/response/dto/ResponseDto.java | 7 +++++ .../response/dto/WeatherResponseDto.java | 6 ++++ .../RealTimeWeatherBatchScheduler.java | 19 +++++++++++++ .../weather/service/WeatherService.java | 28 +++++++++++++++++++ .../feign/client/OpenApiFeignClient.java | 24 ++++++++++++++++ .../src/main/resources/application-prod.yml | 6 +++- 13 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/config/FeignConfig.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/jobs/RealTimeWeatherJob.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/BodyDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/HeaderDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemsDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ResponseDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/WeatherResponseDto.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/scheduler/RealTimeWeatherBatchScheduler.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/service/WeatherService.java create mode 100644 backend/streetdrop-batch/src/main/java/com/depromeet/external/feign/client/OpenApiFeignClient.java diff --git a/backend/streetdrop-batch/build.gradle b/backend/streetdrop-batch/build.gradle index 0005c42a..0077911b 100644 --- a/backend/streetdrop-batch/build.gradle +++ b/backend/streetdrop-batch/build.gradle @@ -13,6 +13,10 @@ jar { enabled = false } +ext { + set('springCloudVersion', "2022.0.3") +} + dependencies { implementation project(':streetdrop-domain') implementation project(':streetdrop-common') @@ -20,6 +24,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' runtimeOnly 'com.mysql:mysql-connector-j' @@ -34,6 +39,12 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok' } +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + test { useJUnitPlatform() } \ No newline at end of file diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/config/FeignConfig.java b/backend/streetdrop-batch/src/main/java/com/depromeet/config/FeignConfig.java new file mode 100644 index 00000000..ac6e10a2 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/config/FeignConfig.java @@ -0,0 +1,11 @@ +package com.depromeet.config; + +import com.depromeet.external.feign.client.OpenApiFeignClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableFeignClients(clients = OpenApiFeignClient.class) +public class FeignConfig { + +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/jobs/RealTimeWeatherJob.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/jobs/RealTimeWeatherJob.java new file mode 100644 index 00000000..5174d4b6 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/jobs/RealTimeWeatherJob.java @@ -0,0 +1,17 @@ +package com.depromeet.domains.weather.jobs; + +import com.depromeet.domains.weather.service.WeatherService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RealTimeWeatherJob { + + private final WeatherService weatherService; + + public void run() { + weatherService.getRealTimeWeather(); + } + +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/BodyDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/BodyDto.java new file mode 100644 index 00000000..3f5cf43f --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/BodyDto.java @@ -0,0 +1,10 @@ +package com.depromeet.domains.weather.response.dto; + +public record BodyDto( + String dataType, + ItemsDto items, + int pageNo, + int numOfRows, + int totalCount +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/HeaderDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/HeaderDto.java new file mode 100644 index 00000000..c716466c --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/HeaderDto.java @@ -0,0 +1,7 @@ +package com.depromeet.domains.weather.response.dto; + +public record HeaderDto( + String resultCode, + String resultMsg +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemDto.java new file mode 100644 index 00000000..5682940b --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemDto.java @@ -0,0 +1,11 @@ +package com.depromeet.domains.weather.response.dto; + +public record ItemDto( + String baseDate, + String baseTime, + String category, + int nx, + int ny, + String obsrValue +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemsDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemsDto.java new file mode 100644 index 00000000..943c374f --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ItemsDto.java @@ -0,0 +1,8 @@ +package com.depromeet.domains.weather.response.dto; + +import java.util.List; + +public record ItemsDto( + List item +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ResponseDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ResponseDto.java new file mode 100644 index 00000000..652786c2 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/ResponseDto.java @@ -0,0 +1,7 @@ +package com.depromeet.domains.weather.response.dto; + +public record ResponseDto( + HeaderDto header, + BodyDto body +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/WeatherResponseDto.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/WeatherResponseDto.java new file mode 100644 index 00000000..281005b8 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/response/dto/WeatherResponseDto.java @@ -0,0 +1,6 @@ +package com.depromeet.domains.weather.response.dto; + +public record WeatherResponseDto( + ResponseDto response +) { +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/scheduler/RealTimeWeatherBatchScheduler.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/scheduler/RealTimeWeatherBatchScheduler.java new file mode 100644 index 00000000..fceffe87 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/scheduler/RealTimeWeatherBatchScheduler.java @@ -0,0 +1,19 @@ +package com.depromeet.domains.weather.scheduler; + +import com.depromeet.domains.weather.jobs.RealTimeWeatherJob; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RealTimeWeatherBatchScheduler { + + private final RealTimeWeatherJob realTimeWeatherJob; + + @Scheduled(cron = "0 0 */3 * * *") + public void runWeatherJob() { + realTimeWeatherJob.run(); + } + +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/service/WeatherService.java b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/service/WeatherService.java new file mode 100644 index 00000000..01d5d5b8 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/domains/weather/service/WeatherService.java @@ -0,0 +1,28 @@ +package com.depromeet.domains.weather.service; + +import com.depromeet.external.feign.client.OpenApiFeignClient; +import com.depromeet.domains.weather.response.dto.WeatherResponseDto; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class WeatherService { + + @Value("${open-api.secret-key}") + private String openApiKey; + + private final OpenApiFeignClient openApiFeignClient; + + public WeatherResponseDto getRealTimeWeather() { + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String time = LocalTime.now().format(DateTimeFormatter.ofPattern("HHmm")); + + return openApiFeignClient.getRealTimeWeather(openApiKey, 1, 8, "json", date, time, 60, 125); + } + +} diff --git a/backend/streetdrop-batch/src/main/java/com/depromeet/external/feign/client/OpenApiFeignClient.java b/backend/streetdrop-batch/src/main/java/com/depromeet/external/feign/client/OpenApiFeignClient.java new file mode 100644 index 00000000..dbf571a5 --- /dev/null +++ b/backend/streetdrop-batch/src/main/java/com/depromeet/external/feign/client/OpenApiFeignClient.java @@ -0,0 +1,24 @@ +package com.depromeet.external.feign.client; + +import com.depromeet.config.FeignConfig; +import com.depromeet.domains.weather.response.dto.WeatherResponseDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = "openApiFeignClient", url = "${open-api.base-url}", configuration = FeignConfig.class) +public interface OpenApiFeignClient { + + @GetMapping(value = "${open-api.weather-api-url}", produces = MediaType.APPLICATION_JSON_VALUE) + WeatherResponseDto getRealTimeWeather( + @RequestParam("serviceKey") String serviceKey, + @RequestParam("pageNo") int pageNo, + @RequestParam("numOfRows") int numOfRows, + @RequestParam("dataType") String dataType, + @RequestParam("base_date") String baseDate, + @RequestParam("base_time") String baseTime, + @RequestParam("nx") int nx, + @RequestParam("ny") int ny); + +} diff --git a/backend/streetdrop-batch/src/main/resources/application-prod.yml b/backend/streetdrop-batch/src/main/resources/application-prod.yml index 3b0e6614..4cbe9f0a 100644 --- a/backend/streetdrop-batch/src/main/resources/application-prod.yml +++ b/backend/streetdrop-batch/src/main/resources/application-prod.yml @@ -18,4 +18,8 @@ auth: header: ${AUTH_HEADER} secret-key: ${AUTH_SECRET_KEY} fcm: - value: streetdrop-notification-fcm.json \ No newline at end of file + value: streetdrop-notification-fcm.json +open-api: + secret-key: ${OPEN_API_KEY} + base-url: ${OPEN_API_URL} + weather-api-url: ${WEATHER_API_URL} \ No newline at end of file From 788295dfcd7f891845fedd7c426251da7f134f78 Mon Sep 17 00:00:00 2001 From: siyeonSon Date: Thu, 9 May 2024 15:05:33 +0900 Subject: [PATCH 2/2] :sparkles: chore: use detailed variable --- .../streetdrop-batch/src/main/resources/application-prod.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/streetdrop-batch/src/main/resources/application-prod.yml b/backend/streetdrop-batch/src/main/resources/application-prod.yml index 4cbe9f0a..2229b56b 100644 --- a/backend/streetdrop-batch/src/main/resources/application-prod.yml +++ b/backend/streetdrop-batch/src/main/resources/application-prod.yml @@ -20,6 +20,6 @@ auth: fcm: value: streetdrop-notification-fcm.json open-api: - secret-key: ${OPEN_API_KEY} - base-url: ${OPEN_API_URL} + secret-key: ${OPEN_API_SECRET_KEY} + base-url: ${OPEN_API_BASE_URL} weather-api-url: ${WEATHER_API_URL} \ No newline at end of file