Skip to content

클래스 이용권 동선과 AI 상태 매핑 정리 - #76

Merged
Roy-wonji merged 1 commit into
developfrom
feature/class-design-ai-release-followup-20261026
Oct 26, 2026
Merged

Roy-wonji merged 1 commit into
developfrom
feature/class-design-ai-release-followup-20261026

Conversation

@Roy-wonji

Copy link
Copy Markdown
Contributor

변경 사항

  • 클래스 소개에서 이용권 등록을 누르면 마이페이지 이용권 화면으로 이동하고 탭바를 표시합니다.
  • AI 피드백 생성 상태를 enum으로 해석합니다.
  • 클래스 참여 화면의 입력 포커스를 정리하고 TestFlight 업로드에 기존 API 키 컨텍스트를 사용합니다.

검증

  • Picke-Stage Release iOS Simulator 빌드 통과
  • git diff --cached --check 통과
  • ruby -c fastlane/Fastfile 통과
  • Device Hub의 Picke-Preview-375에서 앱 로그인 화면까지 실행 확인

클래스 화면의 Figma 대조는 해당 기기의 로그인 세션이 없어 완료하지 못했습니다.

클래스 이용권 진입 시 마이페이지 화면과 탭 표시를 맞추고, AI 생성 상태를 enum으로 처리합니다.

참여 화면 포커스 정리와 TestFlight API 키 전달도 보완합니다.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-26T04:00:10.436974Z 7086518 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전반적으로 잘 구현되었으며, 특히 AI 피드백 상태를 String에서 enum으로 변경하여 타입 안정성과 가독성을 높인 점이 좋습니다. UI 포커스 관리 로직 추가 및 탭 전환 로직도 사용자 경험 개선에 기여합니다. 다만, DTO와 Repository 구현체가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 원칙에 위배됩니다. 이는 Data 모듈로 재배치하는 것을 권고합니다.

}

let state: String
let state: ClassAIGenerationState

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [P2] Major

ClassAIFeedbackDTO 및 해당 DTO에서 사용되는 ClassAIGenerationState가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙(Presentation → Domain ← Data)을 위반합니다. Domain 레이어는 데이터 전송 객체(DTO)를 직접 알아서는 안 되며, DTO와 DTO를 위한 타입 정의는 Data 레이어에 속해야 합니다.

Suggested change
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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [P2] Major

ClassInsightDTO가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. DTO는 Data 레이어에 속해야 합니다. 이에 대한 자세한 내용은 LINE 37의 코멘트를 참고해 주세요.


struct ClassInsightRetryDTO: Decodable, Sendable {
let state: String
let state: ClassAIGenerationState

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [P2] Major

ClassInsightRetryDTO가 Domain 모듈에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. DTO는 Data 레이어에 속해야 합니다. 이에 대한 자세한 내용은 LINE 37의 코멘트를 참고해 주세요.

@@ -0,0 +1,26 @@
import Foundation

enum ClassAIGenerationState: Decodable, Equatable, Sendable {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [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 }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 [P2] Major

ClassRepositoryImpl과 같은 Repository의 구현체는 Data 레이어에 속해야 합니다. 현재 Projects/Domain/ClassDomain/Sources/Repository 경로에 위치하는 것은 클린 아키텍처의 계층 의존성 규칙을 위반합니다. Domain 레이어는 DomainInterface에 정의된 Repository 프로토콜에만 의존해야 합니다.

Suggested change
guard payload.state == .pending else { throw ClassAIFeedbackError.generationFailed }
// Projects/Data/ClassData/Sources/Repository/ClassRepositoryImpl.swift
import DomainClassDomain
import Network
final class ClassRepositoryImpl: ClassRepository {
// ...
}

@Roy-wonji
Roy-wonji merged commit cdd8714 into develop Oct 26, 2026
5 checks passed
@Roy-wonji
Roy-wonji deleted the feature/class-design-ai-release-followup-20261026 branch October 26, 2026 04:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant