-
Notifications
You must be signed in to change notification settings - Fork 2
feat(be): aichat 서비스 구현 및 글로벌 익셉션 수정 #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/common/constant/PromptConstant.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 object를 사용해 싱글톤 상수를 관리하며, const val로 컴파일 타임 상수를 정의하여 효율적입니다. null safety나 when 표현식은 해당되지 않지만, 간단한 상수 파일로서 Kotlin의 idiomatic 스타일을 잘 따릅니다.
- ktlint 규칙 준수: 패키지 선언, object 및 const val 네이밍(PromptConstant, KOREA_TRAVEL_GUIDE_SYSTEM 등)이 PascalCase와 UPPER_SNAKE_CASE 컨벤션을 따르며, 멀티라인 문자열 포맷팅이 깔끔합니다. 들여쓰기와 공백도 적절합니다.
- 글로벌 익셉션 처리와 ApiResponse 사용은 이 상수 파일의 맥락에서 해당되지 않으나, AI_ERROR_FALLBACK 상수가 표준 에러 응답의 일부로 활용될 수 있어 의도된 설계가 좋습니다.
🟡 개선사항:
- 프롬프트 문자열(KOREA_TRAVEL_GUIDE_SYSTEM)에 영어와 한국어를 섞어 사용 중인데, 일관성을 위해 전체를 한국어로 통일하거나 (예: "You are a Korean travel expert AI guide." 대신 한국어 번역), 주석으로 다국어 지원 의도를 명시하면 더 명확해질 수 있습니다.
- 상수 파일이므로 추가 상수가 예상된다면, 관련된 상수들을 그룹화하는 내부 object(예: object SystemPrompts { ... })를 고려해 확장성을 높일 수 있습니다.
🔴 문제점:
- 없음. 새 파일 생성으로 보아 기본 구조가 안정적이며, 규칙 위반 사항이 없습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/common/exception/GlobalExceptionHandler.kt
🟢 좋은점:
- 글로벌 익셉션 처리: @ControllerAdvice를 적절히 사용하며, MethodArgumentNotValidException, IllegalArgumentException, NoSuchElementException, Exception 등 주요 예외를 처리하여 일관된 에러 응답을 제공합니다. 변경 후에도 표준 에러 응답 구조가 유지되어 안정적입니다.
- ApiResponse 사용: 모든 @ExceptionHandler 메서드에서 ResponseEntity<ApiResponse> 형태로 ApiResponse를 감싸 반환하며, 에러 메시지를 body에 포함합니다. 변경 후에도 이 규칙이 철저히 지켜집니다.
- Kotlin 최적화: null safety가 잘 적용되어 있습니다 (e.g., ex.message ?: "default message"). validation 메시지 처리에서 filterIsInstance()와 joinToString()을 활용한 Kotlin idiomatic 코드가 간결하고 효율적입니다. logger 추가로 디버깅이 강화되었습니다.
- ktlint 규칙: 코드 포맷팅이 일관되며 (e.g., 들여쓰기, import 순서), 네이밍 컨벤션이 camelCase로 유지됩니다 (e.g., handleValidation, handleIllegalArgument). 불필요한 주석과 println을 제거하여 깔끔해졌습니다.
🟡 개선사항:
- Kotlin 최적화: validation 메시지 joinToString에서 ", " 구분자를 사용했으나, 다중 에러 시 사용자에게 더 읽기 쉽게 "\n"으로 줄바꿈하거나, 에러별로 별도 필드(예: Map<String, String>)를 ApiResponse에 추가하는 것을 고려하세요. 또한, when 표현식을 도입해 예외 타입별 응답을 중앙화하면 (e.g., handleGenericException 내에서 when(ex)) 코드가 더 유연해질 수 있습니다.
- 글로벌 익셉션 처리: Generic exception 핸들러에서 logger.error에 request.requestURI와 ex를 함께 로깅하는 것은 좋지만, 프로덕션 환경에서 민감한 정보(예: IP나 User-Agent)를 추가 로깅하면 디버깅이 더 나아질 수 있습니다. HttpServletRequest를 모든 핸들러에 주입받아 공통 로깅을 확장하는 확장함수를 고려하세요.
- **kt
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/domain/ai/aiChat/service/AiChatService.kt
🟢 좋은점:
- Kotlin의 null safety를 잘 활용:
findByIdAndUserId결과가 null일 때 IllegalArgumentException을 던져 안전하게 처리하고,chatClient.call().content()가 null일 때AI_ERROR_FALLBACK으로 대체하는 elvis operator(?:) 사용이 적절함. 이는 Kotlin의 null safety 원칙을 준수. - 서비스 로직이 간결하고 책임 분리가 명확: 세션 관리(getSessions, createSession, deleteSession)와 메시지 처리(sendMessage)가 분리되어 있으며, repository를 통해 데이터 접근을 위임.
- 예외 처리 기본 구현:
sendMessage내 try-catch 블록으로 AI 호출 시 발생할 수 있는 예외를 캐치하여 fallback 응답을 제공, 서비스 안정성 향상. - ktlint 규칙 준수: 코드 포맷팅(들여쓰기, 줄 바꿈)이 일관되며, 네이밍 컨벤션(함수명은 동사로 시작, 변수명은 camelCase)이 적절함. 불필요한 import나 중복 코드 없음.
🟡 개선사항:
- Kotlin 최적화 강화:
sendMessage에서 반환 타입Pair<AiChatMessage, AiChatMessage>대신 data class(예:data class ChatResponse(val userMessage: AiChatMessage, val aiMessage: AiChatMessage))를 사용하면 타입 안전성과 가독성이 더 좋아짐. 또한, 반복되는 세션 조회 로직(aiChatSessionRepository.findByIdAndUserId)을 확장 함수나 private 헬퍼 메서드로 추출하여 중복 제거. - AI 채팅 컨텍스트 고려:
sendMessage의chatClient.prompt().user(message)가 현재 세션의 이전 메시지를 포함하지 않아 stateless하게 동작함. 채팅 세션이 있으므로getSessionMessages로 이전 메시지를 불러와chatClient.prompt().messages(...)로 컨텍스트를 추가하면 더 자연스러운 대화 흐름이 될 수 있음. (성능을 위해 최근 N개 메시지만 포함 추천) - 트랜잭션 관리:
sendMessage에서 userMessage와 aiMessage를 순차적으로 save하므로@Transactional어노테이션을 클래스나 메서드에 추가
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - build.gradle.kts
🟢 좋은점:
- ktlint 플러그인(버전 12.1.0)을 명시적으로 추가하고 설정(예: android.set(false), outputToConsole.set(true))하여 Kotlin 코드 스타일 규칙(포맷팅, 네이밍 컨벤션)을 강제 적용하고 있음. 이는 규칙 4(ktlint 규칙)를 잘 준수하며, 팀 개발(5명 규모)에 유용함.
- 의존성 주석이 한국어로 일관되게 변경되어 가독성이 높아짐. 예를 들어, Spring AI 업데이트나 CVE 해결 주석이 명확해 코드 유지보수성을 높임.
- Kotlin DSL(build.gradle.kts)에서 null safety나 when 표현식 같은 최적화는 직접 적용되지 않지만, 간결한 구조(plugins, dependencies 블록)로 Kotlin 스타일을 유지하며 규칙 3을 간접적으로 준수.
🟡 개선사항:
- Spring AI 의존성을 milestone 버전(1.1.0-M2)으로 업그레이드한 것은 좋지만, 안정성을 위해 릴리스 버전(예: 1.0.0 이상 안정 버전)으로 대체하거나, 테스트에서 호환성 검증을 추가 추천. 새로운 artifact(spring-ai-starter-model-chat-memory-repository-jdbc) 추가는 JDBC 채팅 메모리 기능을 강화하지만, PostgreSQL 런타임 의존성과 연계 테스트 필요.
- 주석을 한국어로 변경한 것은 팀 내부적으로 유용하나, 오픈소스나 국제 협업 시 영어 주석을 병행하거나 유지하는 것을 고려. ktlint 설정에서 version "12.1.0"을 최신(현재 12.1.1)으로 업데이트하면 더 나음.
- BOM(dependencyManagement) 제거 주석은 명확하지만, Spring AI의 BOM을 재도입하여 버전 충돌을 방지하는 옵션을 검토(직접 관리 시 의존성 복잡도 증가 가능).
🔴 문제점:
- 없음. 변경사항이 안정적이며, 글로벌 익셉션 처리나 ApiResponse 규칙(1, 2)은 이 빌드 파일과 무관하므로 적용되지 않음. 다만, Spring AI 업그레이드로 인한
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/common/config/AiConfig.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 null safety가 자연스럽게 적용되어 있으며 (예: 빌더 패턴 사용으로 nullable 타입 피함), 코드가 간결하고 읽기 쉽습니다. when 표현식이나 확장함수는 사용되지 않았으나, 불필요한 부분이 아니므로 문제없음.
- ktlint 규칙 준수: 포맷팅이 일관되며 (들여쓰기, 줄바꿈 적절), 네이밍 컨벤션이 camelCase로 잘 지켜짐 (e.g., chatClient, chatMemory). 주석도 명확하고 위치가 적절함.
- ChatMemory를 Jdbc 기반으로 구현하여 영속성을 더한 점이 우수하며, maxMessages(50) 설정으로 메모리 효율성을 고려함.
🟡 개선사항:
- 주석이 한국어로 작성되어 있음. 프로젝트가 다국어 지원이나 영어 중심이라면 영어로 통일하는 것을 고려 (e.g., "ChatMemory bean creation (maintains up to 50 messages, PostgreSQL-based)").
- chatMemory 빈의 maxMessages(50) 값을 하드코딩 대신 application.yml 같은 외부 설정으로 빼서 유연성을 높일 수 있음 (e.g., @value 사용).
- 글로벌 익셉션 처리나 ApiResponse는 이 Config 클래스와 직접 관련 없으나, AI 관련 예외 (e.g., ChatModel 호출 실패)가 발생할 수 있으니 상위 레벨에서 @ControllerAdvice를 통해 처리하도록 권장.
🔴 문제점:
- 없음. 변경사항이 Config 빈 설정에 초점을 맞춰 안정적이며, 필수 검토 항목을 위반하는 부분이 보이지 않음. 다만, JdbcTemplate 의존성이 추가되었으므로 데이터소스 (PostgreSQL)가 제대로 설정되어 있는지 빌드/런타임 테스트 필요.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤖 AI 리뷰 - src/main/kotlin/com/back/koreaTravelGuide/common/constant/PromptConstant.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 object와 const val을 활용해 상수를 효과적으로 관리하며, 멀티라인 문자열(""" """)을 사용해 시스템 프롬프트를 깔끔하게 정의했습니다. null safety나 data class가 필요 없는 간단한 상수 파일로 적합합니다.
- ktlint 규칙 준수: 패키지 선언, object 네이밍(PascalCase), const val 네이밍(상수 컨벤션 준수), 들여쓰기와 포맷팅이 표준적입니다. 불필요한 import나 코드가 없어 깔끔합니다.
🟡 개선사항:
- 시스템 프롬프트 문자열(KOREA_TRAVEL_GUIDE_SYSTEM)이 길어질 경우, 주석으로 각 줄의 목적을 간단히 설명하면 유지보수가 더 쉬워질 수 있습니다. (예: // 사용자 응답 언어 지정)
- 글로벌 익셉션 처리나 ApiResponse와 직접 관련 없으나, 이 상수가 AI 응답 에러 핸들링(AI_ERROR_FALLBACK)에 사용된다면, 관련 컨트롤러나 서비스에서 @ControllerAdvice와 연계해 표준 에러 응답으로 활용하는지 확인하세요.
🔴 문제점:
- 없음. 파일이 새로 추가된 상수 정의로, 모든 규칙을 위반하지 않습니다.
No description provided.