Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .github/workflows/ai-pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,16 @@ jobs:
role: 'system',
content: `코드 리뷰어입니다. 다음 규칙을 검토하세요:

## 필수 검토 항목
1. **글로벌 익셉션 처리**: @ControllerAdvice 사용, 표준 에러 응답
2. **ApiResponse 사용**: 모든 API는 ApiResponse<T>로 감싸서 응답
3. **Kotlin 최적화**: data class, null safety, when 표현식, 확장함수 등
4. **ktlint 규칙**: 포맷팅, 네이밍 컨벤션
## 필수 검토 항목
1. **글로벌 익셉션 처리**: @ControllerAdvice 사용, 표준 에러 응답
2. **ApiResponse 사용**: 모든 API는 ApiResponse<T>로 감싸서 응답
3. **Kotlin 최적화**: data class, null safety, when 표현식, 확장함수 등
4. **ktlint 규칙**: 포맷팅, 네이밍 컨벤션

## 응답 형식
🟢 **좋은점**: [규칙을 잘 지킨 부분]
🟡 **개선사항**: [더 좋게 할 수 있는 부분]
🔴 **문제점**: [반드시 수정해야 할 부분]`
## 응답 형식
🟢 **좋은점**: [규칙을 잘 지킨 부분]
🟡 **개선사항**: [더 좋게 할 수 있는 부분]
🔴 **문제점**: [반드시 수정해야 할 부분]`
}, {
role: 'user',
content: `파일: ${file.filename}\n\n변경사항:\n${file.patch}`
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.back.koreaTravelGuide.domain.ai.aiChat.controller

// TODO: 채팅 컨트롤러 - AI 채팅 API 및 SSE 스트리밍 엔드포인트 제공
import com.back.koreaTravelGuide.domain.ai.aiChat.tool.WeatherTool
import com.back.koreaTravelGuide.domain.ai.weather.dto.WeatherResponse
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.WeatherResponse
import org.springframework.ai.chat.client.ChatClient
import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.GetMapping
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.repository

import com.back.koreaTravelGuide.domain.ai.aiChat.entity.AiChatMessage
import org.springframework.data.jpa.repository.JpaRepository

interface AiChatMessageRepository : JpaRepository<AiChatMessage, Long> {
fun findByAiChatSessionIdOrderByCreatedAtAsc(sessionId: Long): List<AiChatMessage>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.repository

import com.back.koreaTravelGuide.domain.ai.aiChat.entity.AiChatSession
import org.springframework.data.jpa.repository.JpaRepository

interface AiChatSessionRepository : JpaRepository<AiChatSession, Long> {
// 사용자별 세션 조회 (최신순)
fun findByUserIdOrderByCreatedAtDesc(userId: Long): List<AiChatSession>

// 세션 아이디와 사용자 아이디로 세션 조회 (삭제 권한 체크)
fun findByIdAndUserId(
sessionId: Long,
userId: Long,
): AiChatSession?
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.back.koreaTravelGuide.domain.ai.aiChat.tool

// TODO: AI 날씨 도구 - Spring AI @Tool 어노테이션으로 AI가 호출할 수 있는 날씨 기능
import com.back.koreaTravelGuide.domain.ai.weather.dto.MidTermMetricsResult
import com.back.koreaTravelGuide.domain.ai.weather.dto.MidTermNarrativeResult
import com.back.koreaTravelGuide.domain.ai.weather.dto.WeatherResponse
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.MidTermMetricsResult
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.MidTermNarrativeResult
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.WeatherResponse
import com.back.koreaTravelGuide.domain.ai.weather.service.WeatherService
import org.springframework.ai.tool.annotation.Tool
import org.springframework.ai.tool.annotation.ToolParam
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.back.koreaTravelGuide.domain.ai.weather.client

// TODO: 기상청 API 클라이언트 - HTTP 요청으로 날씨 데이터 조회 및 JSON 파싱
import com.back.koreaTravelGuide.domain.ai.weather.dto.PrecipitationData
import com.back.koreaTravelGuide.domain.ai.weather.dto.PrecipitationInfo
import com.back.koreaTravelGuide.domain.ai.weather.dto.TemperatureData
import com.back.koreaTravelGuide.domain.ai.weather.dto.TemperatureInfo
import com.back.koreaTravelGuide.domain.ai.weather.dto.TemperatureDto
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.PrecipitationData
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.PrecipitationInfo
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.TemperatureData
import com.back.koreaTravelGuide.domain.ai.weather.dto.remove.TemperatureInfo
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import org.springframework.web.client.RestTemplate
Expand Down Expand Up @@ -50,7 +51,7 @@ class WeatherApiClient(
fun fetchTemperature(
regionId: String,
baseTime: String,
): TemperatureData? {
): TemperatureDto? {
val url = "$apiUrl/getMidTa?serviceKey=$serviceKey&numOfRows=10&pageNo=1&regId=$regionId&tmFc=$baseTime&dataType=JSON"

println("🌡️ 중기기온조회 API 호출: $url")
Expand All @@ -60,10 +61,10 @@ class WeatherApiClient(
val jsonResponse = restTemplate.getForObject(url, Map::class.java) as? Map<String, Any>
println("📡 중기기온 JSON 응답 수신")

jsonResponse?.let { parseTemperatureDataFromJson(it) } ?: TemperatureData()
jsonResponse?.let { parseTemperatureDataFromJson(it) } ?: TemperatureDto()
} catch (e: Exception) {
println("❌ 중기기온조회 JSON API 오류: ${e.message}")
TemperatureData()
TemperatureDto()
}
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +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,
)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.back.koreaTravelGuide.domain.ai.weather.dto

data class TemperatureAndLandForecastDto()
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.back.koreaTravelGuide.domain.ai.weather.dto

import kotlin.text.set

// TODO: 날씨 내부 데이터 구조 - 기상청 API 응답 데이터 매핑용 내부 클래스들
@Suppress("unused") // JSON 직렬화를 위해 필요
data class TemperatureDto(
private val days: MutableMap<Int, TemperatureInfo?> = mutableMapOf(),
) {
fun setDay(
day: Int,
info: TemperatureInfo?,
) {
days[day] set info
}

fun getDay(day: Int): TemperatureInfo? = days[day]

var day4: TemperatureInfo? get() = days[4]
set(value) {
days[4] set value
}
var day5: TemperatureInfo? get() = days[5]
set(value) {
days[5] set value
}
var day6: TemperatureInfo? get() = days[6]
set(value) {
days[6] set value
}
var day7: TemperatureInfo? get() = days[7]
set(value) {
days[7] set value
}
var day8: TemperatureInfo? get() = days[8]
set(value) {
days[8] set value
}
var day9: TemperatureInfo? get() = days[9]
set(value) {
days[9] set value
}
var day10: TemperatureInfo? get() = days[10]
set(value) {
days[10] set value
}
}

data class TemperatureInfo(
val minTemp: Int?,
val maxTemp: Int?,
val minTempRange: String?,
val maxTempRange: String?,
)

This file was deleted.

Loading