From a59dcd2d1fdf7af0d36b2662b7166eeaf3defdf7 Mon Sep 17 00:00:00 2001 From: JIWONKIMS Date: Fri, 26 Sep 2025 11:48:39 +0900 Subject: [PATCH 1/4] =?UTF-8?q?bug(be):=20application=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{application => }/KoreaTravelGuideApplication.kt | 8 ++++++-- .../domain/ai/aiChat/controller/ChatController.kt | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) rename src/main/kotlin/com/back/koreaTravelGuide/{application => }/KoreaTravelGuideApplication.kt (69%) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/application/KoreaTravelGuideApplication.kt b/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt similarity index 69% rename from src/main/kotlin/com/back/koreaTravelGuide/application/KoreaTravelGuideApplication.kt rename to src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt index b3103ea..3100f1d 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/application/KoreaTravelGuideApplication.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt @@ -1,11 +1,15 @@ -package com.back.koreaTravelGuide.application +package com.back.koreaTravelGuide // TODO: 메인 애플리케이션 클래스 - 스프링 부트 시작점 및 환경변수 로딩 import io.github.cdimascio.dotenv.dotenv +import org.springframework.ai.model.chat.memory.repository.jdbc.autoconfigure.JdbcChatMemoryRepositoryAutoConfiguration import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication -@SpringBootApplication(scanBasePackages = ["com.back.koreaTravelGuide"]) +@SpringBootApplication( + scanBasePackages = ["com.back.koreaTravelGuide"], + exclude = [JdbcChatMemoryRepositoryAutoConfiguration::class], +) class KoreaTravelGuideApplication fun main(args: Array) { diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/controller/ChatController.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/controller/ChatController.kt index 3788bcd..9b6c6b1 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/controller/ChatController.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/controller/ChatController.kt @@ -117,7 +117,7 @@ class ChatController( return emitter } -// 날씨 API 직접 테스트용 엔드포인트 + // 날씨 API 직접 테스트용 엔드포인트 @GetMapping("/weather/test") fun testWeather( @RequestParam(required = false) baseTime: String?, From 66f1d700e86fd6af13ee8d77d729a17edca7cb1a Mon Sep 17 00:00:00 2001 From: JIWONKIMS Date: Fri, 26 Sep 2025 12:04:56 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor(be):=20SpringBootApplication=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EA=B0=84?= =?UTF-8?q?=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JdbcChatMemoryRepositoryAutoConfiguration 제외 설정 제거 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../back/koreaTravelGuide/KoreaTravelGuideApplication.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt b/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt index 3100f1d..cc2558b 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/KoreaTravelGuideApplication.kt @@ -2,14 +2,10 @@ package com.back.koreaTravelGuide // TODO: 메인 애플리케이션 클래스 - 스프링 부트 시작점 및 환경변수 로딩 import io.github.cdimascio.dotenv.dotenv -import org.springframework.ai.model.chat.memory.repository.jdbc.autoconfigure.JdbcChatMemoryRepositoryAutoConfiguration import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication -@SpringBootApplication( - scanBasePackages = ["com.back.koreaTravelGuide"], - exclude = [JdbcChatMemoryRepositoryAutoConfiguration::class], -) +@SpringBootApplication(scanBasePackages = ["com.back.koreaTravelGuide"]) class KoreaTravelGuideApplication fun main(args: Array) { From ff0d9925b629f98a0c0e07ce8d7b5002af0dd2f5 Mon Sep 17 00:00:00 2001 From: JIWONKIMS Date: Fri, 26 Sep 2025 12:43:54 +0900 Subject: [PATCH 3/4] test commit to check ktlint --- .../domain/ai/weather/dto/LandForecastData.kt | 2 +- .../domain/ai/weather/dto/MidForecastDto.kt | 12 ++--- .../dto/TemperatureAndLandForecastDto.kt | 11 ++++- .../domain/ai/weather/dto/TemperatureData.kt | 2 +- .../domain/ai/weather/dto/parser/DtoParser.kt | 45 +++++++++++++++++-- .../ai/weather/service/WeatherService.kt | 4 +- .../ai/weather/service/WeatherServiceCore.kt | 2 +- .../koreaTravelGuide/WeatherApiRealTest.kt | 2 - .../ai/tour/client/TourApiClientTest.kt | 2 +- 9 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/LandForecastData.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/LandForecastData.kt index c445dd0..09fbcb5 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/LandForecastData.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/LandForecastData.kt @@ -1,7 +1,7 @@ package com.back.koreaTravelGuide.domain.ai.weather.dto @Suppress("unused") // JSON 직렬화를 위해 필요 -class LandForecastData( +data class LandForecastData( private val days: MutableMap = mutableMapOf(), ) { fun setDay( diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/MidForecastDto.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/MidForecastDto.kt index 97403ef..e600d4b 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/MidForecastDto.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/MidForecastDto.kt @@ -1,10 +1,10 @@ package com.back.koreaTravelGuide.domain.ai.weather.dto data class MidForecastDto( - val regionCode: String, - val baseTime: String, - val precipitation: String, - val temperature: String, - val maritime: String, - val variability: String, + val regionCode: String?, + val baseTime: String?, + val precipitation: String?, + val temperature: String?, + val maritime: String?, + val variability: String?, ) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt index 307d08b..206ff2d 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt @@ -1,5 +1,14 @@ package com.back.koreaTravelGuide.domain.ai.weather.dto data class TemperatureAndLandForecastDto( - val a: String, + val regionCode: String?, + val baseTime: String?, + val minTemp : Int?, + val maxTemp : Int?, + val minTempRange : String?, + val maxTempRange : String?, + val amRainPercent : Int?, + val pmRainPercent : Int?, + val amWeather : String?, + val pmWeather : String?, ) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureData.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureData.kt index 3b1531b..41fe369 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureData.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureData.kt @@ -2,7 +2,7 @@ package com.back.koreaTravelGuide.domain.ai.weather.dto // TODO: 날씨 내부 데이터 구조 - 기상청 API 응답 데이터 매핑용 내부 클래스들 @Suppress("unused") // JSON 직렬화를 위해 필요 -class TemperatureData( +data class TemperatureData( private val days: MutableMap = mutableMapOf(), ) { fun setDay( diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt index 744d66a..ff038d2 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt @@ -56,11 +56,48 @@ class DtoParser { } fun parseTemperatureAndLandForecast( + regionCode: String, + baseTime: String, temperatureData: TemperatureData, landForecastData: LandForecastData, - ): TemperatureAndLandForecastDto { - return TemperatureAndLandForecastDto( - "a", - ) + ): List { + val resultList = mutableListOf() + + for(i in 4..10) { + val tempInfo = temperatureData.getDay(i) + val landInfo = landForecastData.getDay(i) + + if (tempInfo == null || landInfo == null) { + continue + } + + val minTemp = tempInfo.minTemp + val maxTemp = tempInfo.maxTemp + val minTempRange = tempInfo.minTempRange + val maxTempRange = tempInfo.maxTempRange + + val amRainPercent = landInfo.amRainPercent + val pmRainPercent = landInfo.pmRainPercent + val amWeather = landInfo.amWeather + val pmWeather = landInfo.pmWeather + + // 각 날짜별로 필요한 처리를 수행합니다. + val dto = TemperatureAndLandForecastDto( + regionCode = regionCode, + baseTime = baseTime, + minTemp = minTemp, + maxTemp = maxTemp, + minTempRange = minTempRange, + maxTempRange = maxTempRange, + amRainPercent = amRainPercent, + pmRainPercent = pmRainPercent, + amWeather = amWeather, + pmWeather = pmWeather, + ) + + resultList.add(dto) + } + + return resultList } } diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherService.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherService.kt index 355ed7d..bef4bb2 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherService.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherService.kt @@ -34,13 +34,13 @@ class WeatherService( fun fetchTemperatureAndLandForecast( actualRegionCode: String, actualBaseTime: String, - ): TemperatureAndLandForecastDto? { + ): List? { val tempInfo = weatherApiClient.fetchTemperature(actualRegionCode, actualBaseTime) val landInfo = weatherApiClient.fetchLandForecast(actualRegionCode, actualBaseTime) if (tempInfo == null || landInfo == null) return null - return parser.parseTemperatureAndLandForecast(tempInfo, landInfo) + return parser.parseTemperatureAndLandForecast(actualRegionCode, actualBaseTime, tempInfo, landInfo) } @CacheEvict(cacheNames = ["weatherMidFore", "weatherTempAndLandFore"], allEntries = true) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherServiceCore.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherServiceCore.kt index ef1f200..987cc6b 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherServiceCore.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/service/WeatherServiceCore.kt @@ -22,7 +22,7 @@ class WeatherServiceCore( location: String?, regionCode: String?, baseTime: String?, - ): TemperatureAndLandForecastDto? { + ): List? { val actualLocation = location ?: "서울" val actualRegionCode = regionCode ?: tools.getRegionCodeFromLocation(actualLocation) diff --git a/src/test/kotlin/com/back/koreaTravelGuide/WeatherApiRealTest.kt b/src/test/kotlin/com/back/koreaTravelGuide/WeatherApiRealTest.kt index b7512f5..951f839 100644 --- a/src/test/kotlin/com/back/koreaTravelGuide/WeatherApiRealTest.kt +++ b/src/test/kotlin/com/back/koreaTravelGuide/WeatherApiRealTest.kt @@ -1,5 +1,3 @@ -package com.back.koreaTravelGuide.application - import com.fasterxml.jackson.databind.ObjectMapper import io.github.cdimascio.dotenv.dotenv import org.junit.jupiter.api.BeforeAll diff --git a/src/test/kotlin/com/back/koreaTravelGuide/domain/ai/tour/client/TourApiClientTest.kt b/src/test/kotlin/com/back/koreaTravelGuide/domain/ai/tour/client/TourApiClientTest.kt index d742685..a9d0e29 100644 --- a/src/test/kotlin/com/back/koreaTravelGuide/domain/ai/tour/client/TourApiClientTest.kt +++ b/src/test/kotlin/com/back/koreaTravelGuide/domain/ai/tour/client/TourApiClientTest.kt @@ -1,6 +1,6 @@ package com.back.koreaTravelGuide.domain.ai.tour.client -import com.back.koreaTravelGuide.application.KoreaTravelGuideApplication +import com.back.koreaTravelGuide.KoreaTravelGuideApplication import com.back.koreaTravelGuide.domain.ai.tour.dto.InternalData import com.back.koreaTravelGuide.domain.ai.tour.dto.TourResponse import com.fasterxml.jackson.databind.ObjectMapper From c9a79b374a00d552574f907ba411511afdc77bfd Mon Sep 17 00:00:00 2001 From: JIWONKIMS Date: Fri, 26 Sep 2025 12:44:16 +0900 Subject: [PATCH 4/4] fix: ktlint formatting fixes --- .../dto/TemperatureAndLandForecastDto.kt | 16 +++++------ .../domain/ai/weather/dto/parser/DtoParser.kt | 27 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt index 206ff2d..1e49e06 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/TemperatureAndLandForecastDto.kt @@ -3,12 +3,12 @@ package com.back.koreaTravelGuide.domain.ai.weather.dto data class TemperatureAndLandForecastDto( val regionCode: String?, val baseTime: String?, - val minTemp : Int?, - val maxTemp : Int?, - val minTempRange : String?, - val maxTempRange : String?, - val amRainPercent : Int?, - val pmRainPercent : Int?, - val amWeather : String?, - val pmWeather : String?, + val minTemp: Int?, + val maxTemp: Int?, + val minTempRange: String?, + val maxTempRange: String?, + val amRainPercent: Int?, + val pmRainPercent: Int?, + val amWeather: String?, + val pmWeather: String?, ) diff --git a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt index ff038d2..d34a789 100644 --- a/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt +++ b/src/main/kotlin/com/back/koreaTravelGuide/domain/ai/weather/dto/parser/DtoParser.kt @@ -63,7 +63,7 @@ class DtoParser { ): List { val resultList = mutableListOf() - for(i in 4..10) { + for (i in 4..10) { val tempInfo = temperatureData.getDay(i) val landInfo = landForecastData.getDay(i) @@ -82,18 +82,19 @@ class DtoParser { val pmWeather = landInfo.pmWeather // 각 날짜별로 필요한 처리를 수행합니다. - val dto = TemperatureAndLandForecastDto( - regionCode = regionCode, - baseTime = baseTime, - minTemp = minTemp, - maxTemp = maxTemp, - minTempRange = minTempRange, - maxTempRange = maxTempRange, - amRainPercent = amRainPercent, - pmRainPercent = pmRainPercent, - amWeather = amWeather, - pmWeather = pmWeather, - ) + val dto = + TemperatureAndLandForecastDto( + regionCode = regionCode, + baseTime = baseTime, + minTemp = minTemp, + maxTemp = maxTemp, + minTempRange = minTempRange, + maxTempRange = maxTempRange, + amRainPercent = amRainPercent, + pmRainPercent = pmRainPercent, + amWeather = amWeather, + pmWeather = pmWeather, + ) resultList.add(dto) }