-
Notifications
You must be signed in to change notification settings - Fork 0
[EDMT-456] Spring AI 의존성 제거 및 AI 이벤트 처리 구조 개선 #77
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
…streamlining message handling
…pendency and simplifying event data structure
워크스루AI 스트리밍 및 OpenAI 통합을 제거하고, 이벤트 페이로드를 단순화하여 작업 ID 기반 비동기 처리로 리팩토링했습니다. Spring AI 의존성, 관련 설정, 서비스 인터페이스를 제거하고 직접 SQS 메시징으로 전환했습니다. 변경 사항
시퀀스 다이어그램sequenceDiagram
participant Client
participant Facade as StudentRecordAIFacade
participant EventBus as Event Bus
participant Listener as AIEventListener
participant SQS as SQS Service
Note over Client,SQS: 변경 후 흐름: 작업 ID 기반 비동기 처리
Client->>Facade: createTaskId(userPrompt, requestPrompt, byteCount)
Facade->>Facade: task = createTask(...)
Facade->>Facade: taskId = task.getId()
Facade->>EventBus: AITaskCreateEvent.of(taskId, userPrompt, requestPrompt, byteCount)
Facade-->>Client: TaskResponse with taskId
rect rgb(220, 240, 220)
Note over EventBus,SQS: 이벤트 처리
EventBus->>Listener: handleTaskCreateEvent(event)
Listener->>Listener: taskId = event.taskId()
Listener->>Listener: AITask(userPrompt, requestPrompt, byteCount)
Listener->>SQS: send(AITask)
SQS-->>Listener: ✓ Sent
end
예상 코드 리뷰 노력🎯 4 (복잡도 높음) | ⏱️ ~50분 분석:
관련 PR
추천 라벨
추천 리뷰어
시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
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.
Actionable comments posted: 0
🧹 Nitpick comments (1)
edukit-core/src/main/java/com/edukit/core/event/ai/AIEventListener.java (1)
22-32: 불필요한 String.valueOf() 호출라인 23에서
String.valueOf(generateEvent.taskId())를 사용하고 있습니다.AIResponseGenerateEvent.taskId()는 이미String을 반환하므로String.valueOf()변환이 불필요합니다.다음과 같이 직접 사용하는 것을 권장합니다:
- String taskId = String.valueOf(generateEvent.taskId()); + String taskId = generateEvent.taskId();만약 null 안전성이 필요하다면, 인터페이스 계약에서 taskId가 non-null임을 명시하거나 명시적인 null 체크를 추가하는 것이 더 명확합니다.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
edukit-api/src/main/java/com/edukit/studentrecord/event/AITaskCreateEvent.java(1 hunks)edukit-api/src/main/java/com/edukit/studentrecord/facade/StudentRecordAIFacade.java(1 hunks)edukit-core/src/main/java/com/edukit/core/common/service/AIService.java(0 hunks)edukit-core/src/main/java/com/edukit/core/event/ai/AIEventListener.java(1 hunks)edukit-core/src/main/java/com/edukit/core/event/ai/AIResponseGenerateEvent.java(1 hunks)edukit-core/src/main/java/com/edukit/core/studentrecord/service/AITaskService.java(1 hunks)edukit-external/build.gradle(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/config/SpringAIConfig.java(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/exception/OpenAiErrorCode.java(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/exception/OpenAiException.java(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/service/OpenAIServiceImpl.java(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/setting/OpenAIProperties.java(0 hunks)edukit-external/src/main/java/com/edukit/external/ai/setting/WebClientConfig.java(0 hunks)
💤 Files with no reviewable changes (8)
- edukit-external/build.gradle
- edukit-external/src/main/java/com/edukit/external/ai/setting/OpenAIProperties.java
- edukit-external/src/main/java/com/edukit/external/ai/service/OpenAIServiceImpl.java
- edukit-external/src/main/java/com/edukit/external/ai/exception/OpenAiErrorCode.java
- edukit-external/src/main/java/com/edukit/external/ai/exception/OpenAiException.java
- edukit-core/src/main/java/com/edukit/core/common/service/AIService.java
- edukit-external/src/main/java/com/edukit/external/ai/setting/WebClientConfig.java
- edukit-external/src/main/java/com/edukit/external/ai/config/SpringAIConfig.java
🔇 Additional comments (6)
edukit-core/src/main/java/com/edukit/core/event/ai/AIResponseGenerateEvent.java (1)
5-5: 좋은 개선사항입니다!인터페이스 메서드를
task()에서taskId()로 변경하고 반환 타입을StudentRecordAITask에서String으로 단순화한 것은 결합도를 낮추고 이벤트 구조를 개선하는 좋은 변경입니다. 전체 객체 대신 식별자만 전달하는 것이 이벤트 패턴의 모범 사례와 일치합니다.edukit-api/src/main/java/com/edukit/studentrecord/event/AITaskCreateEvent.java (1)
5-15: 이벤트 구조 단순화가 잘 적용되었습니다!레코드 필드를
StudentRecordAITask task에서String taskId로 변경하고 팩토리 메서드 시그니처를 그에 맞게 업데이트한 것은 명확하고 일관성 있는 개선입니다. 이벤트가 도메인 엔티티 전체 대신 식별자만 전달하도록 개선되어 결합도가 감소했습니다.edukit-core/src/main/java/com/edukit/core/event/ai/AIEventListener.java (2)
15-15: 의존성 단순화가 적절합니다!
@ConditionalOnBean에서AIService.class를 제거하고SqsService.class만 유지한 것은 Spring AI 의존성 제거 목표와 일치하며 적절한 변경입니다.
34-40: AITask 레코드 설계가 깔끔합니다!SQS 페이로드를 표현하기 위한 private record
AITask의 설계가 명확하고 간결합니다. 불변 데이터 구조로 필요한 정보만 담고 있으며,taskId는 메시지 속성으로 별도 전달하는 구조가 합리적입니다.edukit-api/src/main/java/com/edukit/studentrecord/facade/StudentRecordAIFacade.java (1)
40-42: 원본 리뷰 코멘트는 부정확합니다코드 검증 결과:
StudentRecordAITask는@GeneratedValue(strategy = GenerationType.IDENTITY)를 사용합니다IDENTITY전략에서 JPA는save()호출 후 자동으로 생성된 ID를 엔티티에 설정합니다createAITask()메서드가@Transactional이므로 반환되는 task의 ID는 항상 non-null입니다String.valueOf(task.getId())는 안전합니다원본 코멘트의 우려사항(null ID 반환 가능성)은 IDENTITY 전략의 작동 방식에 대한 오해입니다. 현재 코드는 올바르게 작동합니다.
Likely an incorrect or invalid review comment.
edukit-core/src/main/java/com/edukit/core/studentrecord/service/AITaskService.java (1)
19-24: 원본 리뷰 코멘트는 부정확합니다
StudentRecordAITask.start()메서드의 실제 구현을 확인한 결과, 원본 리뷰 코멘트의 우려사항들이 모두 해당되지 않습니다:public void start() { this.startedAt = LocalDateTime.now(); }
start()메서드는getId()를 호출하지 않으며, 단순히startedAt필드에 현재 시간을 설정합니다.- 외부 시스템 호출이나 복잡한 로직이 없으므로 트랜잭션 안전성 문제가 없습니다.
save()전에start()를 호출하는 순서는 안전하며, 이는 의도적인 변경입니다.Likely an incorrect or invalid review comment.
📣 Jira Ticket
EDMT-456
👩💻 작업 내용
Spring AI 의존성 제거
edukit-external/build.gradle에서 Spring AI 의존성 제거SpringAIConfig.javaOpenAIServiceImpl.javaOpenAIProperties.javaWebClientConfig.javaOpenAiErrorCode.javaOpenAiException.javaAI 이벤트 처리 구조 개선
AIEventListener단순화: StudentRecordAITask 의존성 제거AITaskCreateEvent및AIResponseGenerateEvent데이터 구조 간소화createAITask메서드에서 작업 시작변경 통계
📝 리뷰 요청 & 논의하고 싶은 내용
AI 이벤트 구조 변경: StudentRecordAITask 의존성을 제거하고 이벤트 데이터를 단순화했습니다. 이로 인해 결합도가 낮아지고 유지보수성이 향상되었는지 확인 부탁드립니다.
Spring AI 제거 영향: Spring AI 의존성 제거가 기존 AI 기능에 영향을 주지 않는지 검토 부탁드립니다.
초기화 로직: AI 작업을 생성 시점에 바로 시작하도록 변경했는데, 비즈니스 로직상 문제가 없는지 확인 부탁드립니다.
Test Plan
✅ Manual Testing Checklist
🧪 Automated Tests
./gradlew test./gradlew build🔍 Code Quality
Deployment Notes
🤖 Generated with Claude Code
Summary by CodeRabbit
릴리스 노트
개선사항
리팩터링