TDD + Tidy First 원칙 준수. 매 커밋마다 빌드 가능 상태 유지.
go입력 시 다음 미완료 항목을 진행.
현재 의존 그래프 (문제 부분만):
AllTabFeature ──concrete──▶ HomeFeature
──concrete──▶ BugReportFeature
──concrete──▶ CheckSelfStudyTeacherFeature
──concrete──▶ ChangePasswordFeature
──concrete──▶ ClassroomMoveListFeature
──concrete──▶ OutListFeature
──concrete──▶ OutingHistoryFeature
──concrete──▶ SelfStudyCheckFeature (← 이 안에 AcceptFeature 데드 임포트)
HomeFeature ──interface──▶ AllTabFeatureInterface
──interface──▶ PlanFeatureInterface
──interface──▶ SchoolMealFeatureInterface
──interface──▶ AcceptFeatureInterface ← 제거 대상
AppComponent ──conforms──▶ 12개 Dependency 프로토콜 (전부 직접)
-
SelfStudyCheckView.swift에서import AcceptFeature제거 -
SelfStudyCheck/Project.swift에서.Features.acceptFeature제거 - 빌드 검증:
make test SCHEME=SelfStudyCheckFeature(6개 테스트 통과)
커밋: chore[refact]: Remove dead AcceptFeature import from SelfStudyCheckView
AllTabView가 8개 Feature를 concrete import하는 구조를 Factory 프로토콜 주입으로 전환. AllTabFeature는 자기 도메인(AllTabDomainInterface)만 알고, 하위 Feature들의 View는 Factory를 통해 받는다.
-
ChangePasswordFactory,NewPasswordFactory를 Interface 모듈로 이동 -
NewPasswordFactory.makeView에onSuccess파라미터 추가
커밋: chore[refact]: Move ChangePassword/NewPassword factory protocols to Interface
-
AllTabFeature.swift삭제 (SelfStudyCheckFeature.swift와 동일 패턴) -
AllTabComponent.makeView()가AllTabView를 직접 호출하도록 수정
커밋: chore[refact]: Delete AllTabFeature passthrough wrapper
-
AllTabView생성자에 8개 Factory 파라미터 추가 (WithPerceptionTracking, @Perception.Bindable) - concrete Feature import 제거, FeatureInterface import로 교체
- AllTabReducer.State에 @ObservableState 추가
커밋: feat[red]: AllTabView receives sub-feature factories instead of concrete imports
-
AllTabDependency— use case 17개 → factory 8개 + 자체 2개로 교체 -
AllTabComponent.makeView()— factories를 AllTabView에 주입 -
AllTabFeature/Project.swift— concrete Feature 의존 제거, FeatureInterface 의존만 유지
커밋: feat[green]: Wire AllTabComponent to inject sub-feature factories
- AllTabComponent.swift를 AllTabFeature → App 타겟으로 이동 (concrete import 허용)
- AllTabDependency: getMyNameUseCase + authRepository만 유지 (factory 요구 제거)
- AllTabComponent에서 8개 자식 Component 직접 생성 (
parent: self) - AppComponent: CheckSelfStudyTeacherDependency 등 7개 Dependency 준수 제거
- AppComponent: 8개 factory 프로퍼티 제거 (AllTabComponent가 직접 담당)
- NeedleGenerated.swift 재생성:
^->AppComponent->AllTabComponent->*Component경로 반영
커밋: chore[refact]: Move tab-feature components under AllTabComponent
AllTabDependency의 17개 use case → 8개 factory + 2개 자체 도메인으로 교체 (Phase 1-2에서 완료). AppComponent 확장 파일의 dead import 제거.
- 모든 하위 Feature Dependency 프로토콜이 이미 자기 Domain use case만 보유
-
AppComponent+SelfStudyCheck.swift—NeedleFoundation,SwiftUI,SelfStudyCheckFeature제거 -
AppComponent+OutList.swift—NeedleFoundation,SwiftUI,OutListFeature,OutListFeatureInterface제거 -
AppComponent+ClassroomMoveList.swift—NeedleFoundation,SwiftUI,ClassroomMoveListFeature,ClassroomMoveListFeatureInterface제거 -
AppComponent+OutingHistory.swift—NeedleFoundation,SwiftUI,OutingHistoryFeature,OutingHistoryFeatureInterface제거 -
AppComponent+ChangePassword.swift—NeedleFoundation,ChangePasswordFeature제거 -
AllTabDependency에서 하위 Feature 관련 use case 제거 (Phase 1-2에서 완료)
커밋: chore[refact]: Remove dead Feature imports and modernize Plan/SchoolMeal TCA pattern
HomeFeature가 AllTab/Plan/SchoolMeal/Accept Factory를 알고 있는 구조 개선.
-
PlanView.swift에서import HomeFeature제거 + WithPerceptionTracking 전환 -
SchoolMealView.swift에서import HomeFeature제거 + WithPerceptionTracking 전환 -
PlanReducer.State,SchoolMealReducer.State에@ObservableState추가
-
HomeDependencyfactory 4개 유지 (TabBarView에서 탭별 View 생성에 필요) -
HomeFeature/Project.swift에 누락된 의존성 추가 (acceptFeatureInterface, acceptDomainInterface, classroomMoveListDomainInterface, outListDomainInterface) -
HomeComponent.swift에서 deadimport AllTabDomainInterface제거 -
HomeReducer.State에@ObservableState추가 -
HomeView.swiftWithViewStore → WithPerceptionTracking 전환
커밋: chore[refact]: Fix HomeFeature Project.swift deps and modernize HomeView TCA pattern
-
HomeComponent를 App 타겟으로 이동 (PlanComponent/SchoolMealComponent/AcceptComponent를 parent: self로 생성) -
HomeDependency에서 planFactory/schoolMealFactory/acceptFactory 제거 -
AppComponent+Plan.swift에서planFactory제거 -
AppComponent+SchoolMeal.swift에서schoolMealFactory제거 -
AppComponent에서 PlanDependency/SchoolMealDependency/AcceptDependency 제거, acceptFactory 제거 -
AppComponent준수 수: HomeDependency + AllTabDependency (2개) -
make needle후 경로 검증:^->AppComponent->HomeComponent->PlanComponent등 확인 - NeedleGenerated.swift import 수: 64개 (Feature 모듈 수에 비례하므로 현재 아키텍처 한계)
커밋: chore[refact]: Slim down AppComponent dependency conformances
SecretKey, VerifyEmail, Password, InfoSetting 4개가 AppComponent 직접 자식인 구조 개선.
-
SignupFlowComponent신규 생성 - 4개 Signup Component를 SignupFlowComponent 자식으로 이동
- AppComponent에서 SignupFlowComponent 하나만 참조
-
make needle후 빌드 검증
커밋: chore[refact]: Group signup flow under SignupFlowComponent
- Feature → Feature concrete import 0개 (
grep -r "import.*Feature" Projects/Feature --include="*.swift" | grep -v "Interface\|BaseFeature"결과 없음) -
AllTabDependencyuse case 수 ≤ AllTab 자체 도메인 것만 -
AppComponentDependency 프로토콜 준수 수 ≤ 4개 - NeedleGenerated.swift import 수 ≤ 30개
-
make test-all-features전체 통과 -
tuist generate --no-open성공