-
Notifications
You must be signed in to change notification settings - Fork 2
feat(be): 커밋메시지에 적어놨습니다. (#18) #31
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
- AiChatController 6개 엔드포인트 완성
* GET /sessions (세션 목록)
* POST /sessions (세션 생성)
* DELETE /sessions/{id} (세션 삭제)
* GET /sessions/{id}/messages (메시지 조회)
* POST /sessions/{id}/messages (메시지 전송)
* PATCH /sessions/{id}/title (제목 수정)
- Service Layer Entity 반환으로 리팩토링
- Controller Layer DTO 변환 책임 분리
- getSessionWithOwnershipCheck 헬퍼 메서드 적용
- ChatController → AiChatController 리네임
- DTO 구조 정리 및 신규 DTO 추가
- AiChatController 6개 엔드포인트 완성
* GET /sessions (세션 목록)
* POST /sessions (세션 생성)
* DELETE /sessions/{id} (세션 삭제)
* GET /sessions/{id}/messages (메시지 조회)
* POST /sessions/{id}/messages (메시지 전송)
* PATCH /sessions/{id}/title (제목 수정)
- Service Layer Entity 반환으로 리팩토링
- Controller Layer DTO 변환 책임 분리
- getSessionWithOwnershipCheck 헬퍼 메서드 적용
- ChatController → AiChatController 리네임
- DTO 구조 정리 및 신규 DTO 추가
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/controller/AiChatController.kt
🟢 좋은점:
- 컨트롤러 구조가 RESTful API 규칙을 잘 따르고 있으며, 경로 설계(/api/aichat/sessions 등)가 직관적임. @RestController와 @RequestMapping을 적절히 사용해 코드가 간결함.
- Kotlin의 기본 기능을 활용해 서비스 호출과 DTO 매핑이 간단하게 구현됨 (e.g., map {} 사용으로 리스트 변환).
- ktlint 규칙 준수: 포맷팅이 일관되며, 네이밍 컨벤션 (camelCase, 의미 있는 메서드명)이 잘 지켜짐. 불필요한 import나 중복 코드 없음.
🟡 개선사항:
- Kotlin 최적화 측면에서 null safety를 더 강화할 수 있음. 예를 들어,
it.id!!대신it.id ?: throw IllegalStateException("Session ID is null")처럼 명시적 예외 처리나 Optional 체이닝을 고려. 이는 런타임 오류를 방지하고 코드 가독성을 높임. sendMessage와updateSessionTitle메서드에서 서비스 호출 결과를 바로 DTO로 매핑하는 대신, 확장 함수나 유틸 함수를 도입하면 코드 재사용성이 높아질 수 있음 (e.g.,toResponse()확장 함수).- RequestParam으로 userId를 받는 부분이 여러 메서드에 반복되는데, 인터셉터나 공통 핸들러로 추출하면 DRY 원칙을 더 잘 따를 수 있음.
🔴 문제점:
- ApiResponse 사용 미준수: 모든 API 응답이 ApiResponse로 감싸지지 않음 (e.g.,
List<SessionsResponse>직접 반환). 모든 메서드의 반환 타입을ResponseEntity<ApiResponse<List<SessionsResponse>>>등으로 변경하고, 성공/실패 케이스를 ApiResponse로 래핑해야 함. 이는 표준 응답 형식을 보장하지 않아 클라이언트 측에서 일관된 처리가 어려움. - 글로벌 익셉션 처리 미적용: 컨트롤러에서 예외(예: 유효하지 않은 sessionId나 userId)가 발생할 수 있지만, @ControllerAdvice나 try-catch로 처리되지 않음. 프로젝트 전체
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/controller/ChatController.kt
🟢 좋은점:
- Kotlin의 null safety가 일부 적용되어 있음 (예:
content() ?: "응답을 받을 수 없습니다."에서 Elvis 연산자 사용). 이는 기본적인 안전성을 보장하며, Kotlin의 장점을 활용한 부분. - SSE 스트리밍 구현에서 Reactor의 Flux와 Schedulers를 적절히 사용해 비동기 처리와 스레드 안전성을 고려한 점이 좋음.
doOnCancel과publishOn으로 리소스 관리를 신경 쓴 흔적이 보임. - ktlint 규칙 준수: 코드 포맷팅(들여쓰기, 세미콜론 미사용)이 Kotlin 컨벤션에 맞고, 네이밍(예:
chatSse,testWeather)이 camelCase로 일관됨. 주석도 명확함.
🟡 개선사항:
- Kotlin 최적화:
when표현식이나 확장 함수를 더 활용할 수 있음. 예를 들어, 에러 핸들링 부분에서try-catch대신Result타입이나 sealed class를 사용해 더 함수형으로 만들 수 있음. 또한,Map<String, String>반환 대신 data class(예:data class CurrentTimeResponse(val currentKstTime: String, val timezone: String, val timestamp: String))로 변경하면 직렬화와 유지보수가 쉬워짐. - SSE 구현에서
lateinit var disposable대신 Kotlin의scope나coroutine을 도입해 더 현대적으로 리팩토링 가능. 현재 Reactor 기반이지만, Spring WebFlux와의 통합을 고려하면 Flux를 직접 반환하는 엔드포인트로 전환하는 게 나을 수 있음. - 주석 처리된 코드(예:
simpleWeather,debugWeatherApi)를 제거하거나 별도 파일로 분리해 코드 청결성을 높임. TODO 주석은 구체적인 작업 계획으로 업데이트.
🔴 문제점:
- 글로벌 익셉션 처리 미준수: 각 메서드에 개별
try-catch가 있지만, @ControllerAdvice를 사용한 중앙화된 에러 핸들링이 없음. 예외 발생 시 "오류 발생: ${e.message}"처럼 비표준 응답이
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/dto/AiChatRequest.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 data class를 적절히 사용하며, null safety를 준수하고 있습니다.
message프로퍼티가 non-null String으로 선언되어 기본적인 안전성을 확보했습니다. - ktlint 규칙 준수: 네이밍 컨벤션(PascalCase 클래스명, camelCase 프로퍼티명)이 적합하며, 포맷팅(들여쓰기, 줄바꿈)이 간결하고 표준적입니다.
🟡 개선사항:
- Kotlin 최적화: 요청 DTO이므로, 빈 메시지나 유효성 검증을 위해
@Valid어노테이션과 함께 Jakarta Validation(예:@NotBlankonmessage)을 추가하면 더 robust해질 수 있습니다. 예:val message: String @NotBlank @get:NotBlank. - ktlint 규칙: 패키지 경로가 길고 중첩되어 있으므로, 필요 시 도메인 구조를 재검토하여 불필요한 중복(예:
ai.aiChat)을 줄이는 것을 고려하세요.
🔴 문제점:
- 없음. 이 파일은 간단한 DTO로, 필수 검토 항목(글로벌 익셉션 처리, ApiResponse)에 직접 해당되지 않으며, 기본 구조가 올바릅니다.
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/controller/AiChatController.kt
🟢 좋은점:
- ApiResponse 사용: 모든 API 엔드포인트의 응답이
ResponseEntity<ApiResponse<T>>로 일관되게 감싸여 있으며, 성공 메시지와 데이터를 적절히 포함하고 있습니다. 이는 규칙을 완벽히 준수합니다. - Kotlin 최적화: DTO(예:
SessionsResponse,AiChatResponse등)를 data class로 사용한 것으로 보이며(임포트된 DTO 기반), val 키워드를 활용해 불변성을 강조합니다. map 연산자 등을 활용한 간결한 데이터 변환도 Kotlin다운 스타일입니다. - ktlint 규칙: 코드 포맷팅이 일관적이며(들여쓰기, 줄 바꿈), 네이밍 컨벤션이 camelCase로 잘 지켜집니다. 클래스와 메서드 이름이 직관적입니다.
🟡 개선사항:
- Kotlin 최적화:
it.id!!처럼 강제 null assertion(!!)을 사용하고 있습니다. null safety를 강화하기 위해it.id ?: throw IllegalStateException("Session ID is null")처럼 safe call이나 예외 처리로 대체하는 것을 고려하세요. 또한, when 표현식을 활용할 수 있는 로직(예: senderType에 따른 분기)이 없지만, 서비스 계층에서 확장 함수를 도입하면 컨트롤러를 더 간결하게 만들 수 있습니다. - ktlint 규칙:
@RequestParam userId: Long이 모든 메서드에 반복적으로 사용되는데, 이는 중복입니다. 공통 어노테이션이나 인터셉터(예:@CurrentUser확장)를 도입해 네이밍과 코드 중복을 줄일 수 있습니다. 또한, 긴 map 블록(예: getSessionMessages의 response 매핑)을 별도 확장 함수로 분리하면 가독성이 높아집니다. - 전반적: userId를 쿼리 파라미터로 받는 대신
@AuthenticationPrincipal이나 헤더(예: Authorization)로 인증된 사용자 ID를 추출하는 방식으로 변경하면 보안과 편의성이 개선됩니다. 이는 Kotlin의 null safety와도 잘 맞물립니다.
🔴 문제점:
- 글로벌 익셉션 처리:
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/controller/ChatController.kt
🟢 좋은점:
- Kotlin의 null safety를 일부 활용하여
content() ?: "응답을 받을 수 없습니다."처럼 기본값을 제공하며, Flux 스트리밍에서 에러 핸들링(doOnCancel,subscribe의 error/complete 콜백)을 통해 안정적인 SSE 구현을 보여줌. Reactor의Schedulers.boundedElastic()를 사용해 I/O 작업을 적절히 분리하여 성능 최적화 측면에서 좋음. - ktlint 규칙 준수: 코드 포맷팅(들여쓰기, import 순서)이 일관되며, 네이밍 컨벤션(예: camelCase 메서드명)이 대체로 따름. 주석 처리된 부분(예:
// TODO)으로 의도를 명확히 표현.
🟡 개선사항:
- Kotlin 최적화:
when표현식이나 확장 함수를 활용할 여지가 있음. 예를 들어, 에러 핸들링 부분에서try-catch대신Result타입이나 sealed class를 사용해 더 함수형으로 처리 가능.lateinit var disposable은 불가피하지만, Kotlin의use나addOnDispose같은 패턴으로 리소스 관리를 더 안전하게 할 수 있음. 시스템 프롬프트가 하드코딩되어 있으니@Value주석을 활성화하거나 properties로 외부화 추천. - 파라미터 네이밍: SSE 엔드포인트의
@RequestParam q: String을question: String으로 명확히 변경하면 가독성 향상. 테스트 엔드포인트(/weather/test,/time/current)는 프로파일(예:@Profile("dev"))로 제한하거나 제거 고려 – 프로덕션 노출 시 보안 이슈 발생 가능. - SSE 구현에서
emitter.send의 이벤트 빌더를 반복적으로 사용하니, 확장 함수로 추출해 코드 중복 줄임 (예:fun SseEmitter.sendMessage(data: String)).
🔴 문제점:
- 글로벌 익셉션 처리 미준수:
@ControllerAdvice를 사용하지 않고 각 메서드에서 개별try-catch나completeWithError로 처리. 이는 표준 에러 응답(예
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/dto/AiChatRequest.kt
🟢 좋은점:
- Kotlin 최적화 측면에서 data class를 적절히 사용하며, null safety를 준수 (message가 non-null String으로 정의됨). 간단한 DTO로서 불필요한 복잡성을 피함.
- ktlint 규칙 준수: 네이밍 컨벤션 (PascalCase 클래스명, camelCase 프로퍼티명)이 적합하고, 포맷팅이 깔끔함.
🟡 개선사항:
- Kotlin 최적화: message 필드에 @Valid나 기본 validation (e.g., @notblank)을 추가하면 입력 검증이 강화될 수 있음. 현재는 기본 DTO이므로 필수 아님.
- ktlint 규칙: 패키지 구조가 도메인 중심으로 잘 구성되었으나, 프로젝트 전체 패키지 규칙 (e.g., 더 세밀한 서브패키지 분리)을 확인해 일관성 유지 추천.
🔴 문제점:
- 없음. 글로벌 익셉션 처리와 ApiResponse는 이 DTO 파일과 직접 관련 없으므로 해당되지 않음.
No description provided.