Repository navigation
클래스 이용권 동선과 AI 상태 매핑 정리 - #76
Conversation
클래스 이용권 진입 시 마이페이지 화면과 탭 표시를 맞추고, AI 생성 상태를 enum으로 처리합니다. 참여 화면 포커스 정리와 TestFlight API 키 전달도 보완합니다.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
| } | ||
|
|
||
| let state: String | ||
| let state: ClassAIGenerationState |
There was a problem hiding this comment.
🟠 [P2] Major
ClassAIFeedbackDTO 및 해당 DTO에서 사용되는 ClassAIGenerationState가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙(Presentation → Domain ← Data)을 위반합니다. Domain 레이어는 데이터 전송 객체(DTO)를 직접 알아서는 안 되며, DTO와 DTO를 위한 타입 정의는 Data 레이어에 속해야 합니다.
| let state: ClassAIGenerationState | |
| // Projects/Data/ClassData/Sources/Model/DTO/ClassAIFeedbackDTO.swift | |
| import Foundation | |
| import DomainClassDomainInterface | |
| struct ClassPersonalReportDTO: Decodable, Sendable { | |
| // ... | |
| let state: ClassAIGenerationState // ClassAIGenerationState도 Data 모듈로 이동 | |
| // ... | |
| } | |
| // Projects/Data/ClassData/Sources/Model/DTO/ClassAIGenerationState.swift | |
| import Foundation | |
| enum ClassAIGenerationState: Decodable, Equatable, Sendable { | |
| // ... (기존 코드 유지) | |
| } |
| } | ||
|
|
||
| let state: String | ||
| let state: ClassAIGenerationState |
There was a problem hiding this comment.
🟠 [P2] Major
ClassInsightDTO가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. DTO는 Data 레이어에 속해야 합니다. 이에 대한 자세한 내용은 LINE 37의 코멘트를 참고해 주세요.
|
|
||
| struct ClassInsightRetryDTO: Decodable, Sendable { | ||
| let state: String | ||
| let state: ClassAIGenerationState |
There was a problem hiding this comment.
🟠 [P2] Major
ClassInsightRetryDTO가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. DTO는 Data 레이어에 속해야 합니다. 이에 대한 자세한 내용은 LINE 37의 코멘트를 참고해 주세요.
| @@ -0,0 +1,26 @@ | |||
| import Foundation | |||
|
|
|||
| enum ClassAIGenerationState: Decodable, Equatable, Sendable { | |||
There was a problem hiding this comment.
🟠 [P2] Major
ClassAIGenerationState는 DTO의 상태를 표현하는 타입이므로 Data 레이어에 정의되어야 합니다. 현재 Domain 모듈에 위치하는 것은 계층 의존성 원칙에 위배됩니다. 이에 대한 자세한 내용은 ClassAIFeedbackDTO.swift LINE 37의 코멘트를 참고하여 Data 레이어로 이동시키는 것을 권고합니다.
| do { | ||
| let payload = try await client.send(ClassResultService.retryInsight(roomID), as: ClassInsightRetryDTO.self) | ||
| guard payload.state == "PENDING" else { throw ClassAIFeedbackError.generationFailed } | ||
| guard payload.state == .pending else { throw ClassAIFeedbackError.generationFailed } |
There was a problem hiding this comment.
🟠 [P2] Major
ClassRepositoryImpl과 같은 Repository의 구현체는 Data 레이어에 속해야 합니다. 현재 Projects/Domain/ClassDomain/Sources/Repository 경로에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. Domain 레이어는 DomainInterface에 정의된 Repository 프로토콜에만 의존해야 합니다.
| guard payload.state == .pending else { throw ClassAIFeedbackError.generationFailed } | |
| // Projects/Data/ClassData/Sources/Repository/ClassRepositoryImpl.swift | |
| import DomainClassDomain | |
| import Network | |
| final class ClassRepositoryImpl: ClassRepository { | |
| // ... | |
| } |
변경 사항
검증
git diff --cached --check통과ruby -c fastlane/Fastfile통과클래스 화면의 Figma 대조는 해당 기기의 로그인 세션이 없어 완료하지 못했습니다.