Skip to content

Commit 3c9360a

Browse files
committed
feat(be): aichat 서비스 구현 및 글로벌 익셉션 수정
1 parent c102882 commit 3c9360a

File tree

3 files changed

+53
-33
lines changed

3 files changed

+53
-33
lines changed

src/main/kotlin/com/back/koreaTravelGuide/common/constant/PromptConstant.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ object PromptConstant {
99
"""
1010

1111
const val AI_ERROR_FALLBACK = "죄송합니다. 일시적인 문제로 응답을 생성할 수 없습니다. 다시 시도해 주세요."
12-
}
12+
}

src/main/kotlin/com/back/koreaTravelGuide/common/exception/GlobalExceptionHandler.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ class GlobalExceptionHandler {
2222

2323
@ExceptionHandler(MethodArgumentNotValidException::class)
2424
fun handleValidation(ex: MethodArgumentNotValidException): ResponseEntity<ApiResponse<Void>> {
25-
val message = ex.bindingResult.allErrors.filterIsInstance<FieldError>()
26-
.joinToString(", ") { "${it.field}: ${it.defaultMessage}" }
25+
val message =
26+
ex.bindingResult.allErrors.filterIsInstance<FieldError>()
27+
.joinToString(", ") { "${it.field}: ${it.defaultMessage}" }
2728
logger.warn("입력값 검증 실패: {}", message)
2829
return ResponseEntity.badRequest().body(ApiResponse("입력값 검증 실패: $message"))
2930
}
@@ -41,7 +42,10 @@ class GlobalExceptionHandler {
4142
}
4243

4344
@ExceptionHandler(Exception::class)
44-
fun handleGenericException(ex: Exception, request: HttpServletRequest): ResponseEntity<ApiResponse<Void>> {
45+
fun handleGenericException(
46+
ex: Exception,
47+
request: HttpServletRequest,
48+
): ResponseEntity<ApiResponse<Void>> {
4549
logger.error("서버 오류 - {}: {} at {}", ex::class.simpleName, ex.message, request.requestURI, ex)
4650
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse("서버 내부 오류가 발생했습니다"))
4751
}

src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/service/AiChatService.kt

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.springframework.stereotype.Service
1414
class AiChatService(
1515
private val aiChatMessageRepository: AiChatMessageRepository,
1616
private val aiChatSessionRepository: AiChatSessionRepository,
17-
private val chatClient: ChatClient
17+
private val chatClient: ChatClient,
1818
) {
1919
fun getSessions(userId: Long): List<AiChatSession> {
2020
return aiChatSessionRepository.findByUserIdOrderByCreatedAtDesc(userId)
@@ -25,46 +25,62 @@ class AiChatService(
2525
return aiChatSessionRepository.save(newSession)
2626
}
2727

28-
fun deleteSession(sessionId: Long, userId: Long) {
29-
val session = aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
30-
?: throw IllegalArgumentException("해당 채팅방이 없거나 삭제 권한이 없습니다.")
28+
fun deleteSession(
29+
sessionId: Long,
30+
userId: Long,
31+
) {
32+
val session =
33+
aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
34+
?: throw IllegalArgumentException("해당 채팅방이 없거나 삭제 권한이 없습니다.")
3135

3236
aiChatSessionRepository.deleteById(sessionId)
3337
}
3438

35-
fun getSessionMessages(sessionId: Long, userId: Long): List<AiChatMessage> {
36-
val session = aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
37-
?: throw IllegalArgumentException("해당 채팅방이 없거나 접근 권한이 없습니다.")
39+
fun getSessionMessages(
40+
sessionId: Long,
41+
userId: Long,
42+
): List<AiChatMessage> {
43+
val session =
44+
aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
45+
?: throw IllegalArgumentException("해당 채팅방이 없거나 접근 권한이 없습니다.")
3846

3947
return aiChatMessageRepository.findByAiChatSessionIdOrderByCreatedAtAsc(sessionId)
4048
}
4149

42-
fun sendMessage(sessionId: Long, userId: Long, message: String): Pair<AiChatMessage, AiChatMessage> {
43-
val session = aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
44-
?: throw IllegalArgumentException("해당 채팅방이 없거나 접근 권한이 없습니다.")
50+
fun sendMessage(
51+
sessionId: Long,
52+
userId: Long,
53+
message: String,
54+
): Pair<AiChatMessage, AiChatMessage> {
55+
val session =
56+
aiChatSessionRepository.findByIdAndUserId(sessionId, userId)
57+
?: throw IllegalArgumentException("해당 채팅방이 없거나 접근 권한이 없습니다.")
4558

46-
val userMessage = AiChatMessage(
47-
aiChatSession = session,
48-
senderType = SenderType.USER,
49-
content = message
50-
)
59+
val userMessage =
60+
AiChatMessage(
61+
aiChatSession = session,
62+
senderType = SenderType.USER,
63+
content = message,
64+
)
5165
val savedUserMessage = aiChatMessageRepository.save(userMessage)
5266

53-
val response = try {
54-
chatClient.prompt()
55-
.system(KOREA_TRAVEL_GUIDE_SYSTEM)
56-
.user(message)
57-
.call()
58-
.content() ?: AI_ERROR_FALLBACK
59-
} catch (e: Exception) {
60-
AI_ERROR_FALLBACK
61-
}
67+
val response =
68+
try {
69+
chatClient.prompt()
70+
.system(KOREA_TRAVEL_GUIDE_SYSTEM)
71+
.user(message)
72+
.call()
73+
.content() ?: AI_ERROR_FALLBACK
74+
} catch (e: Exception) {
75+
AI_ERROR_FALLBACK
76+
}
6277

63-
val aiMessage = AiChatMessage(
64-
aiChatSession = session,
65-
senderType = SenderType.AI,
66-
content = response
67-
)
78+
val aiMessage =
79+
AiChatMessage(
80+
aiChatSession = session,
81+
senderType = SenderType.AI,
82+
content = response,
83+
)
6884
val savedAiMessage = aiChatMessageRepository.save(aiMessage)
6985
return Pair(savedUserMessage, savedAiMessage)
7086
}

0 commit comments

Comments
 (0)