Case 01 · TMA / Micro Feature
레이어 절단에서 피처 절단으로 · 피처 하나 = 5타겟
전편은 Domain / Data / Presentation 레이어로 코드를 갈랐습니다. 검색 하나를 고치는 데 세 레이어 모듈을 동시에 수정해야 했습니다. 전편 README에 스스로 적어 둔 한계(모듈 비대화, 테스트 세분화 제한)가 이 프로젝트의 출발점입니다.
절단 방향을 수평에서 수직으로 바꿨습니다. 피처 하나를 Interface·구현·Testing·Tests·Demo 다섯 타겟으로 자르면 검색 코드는 FeatureSearch 한 모듈 안에 전부 모입니다. Micro Feature는 Clean을 버리는 것이 아니라 감쌉니다. 피처 내부는 여전히 Composition / Domain / Data / Presentation이고 피처 사이만 Interface로 통신합니다.
의존 규칙을 빌드 설정으로 강제했습니다. 피처끼리는 Interface로만 의존하고 구현체 import는 App만 할 수 있습니다. FeatureProfile은 FeatureAuth의 Interface에만 의존하므로 구현 타입을 참조하는 코드는 컴파일되지 않습니다.
기능 하나를 고칠 때 건드리는 모듈이 하나가 됐습니다. Testing 타겟이 공개한 Mock을 Tests와 Demo가 재사용해 피처별 단독 테스트와 단독 실행이 가능해졌고 전편의 "테스트 세분화 제한"이 풀렸습니다.
let project = Project.module( name: ModulePaths.Feature.FeatureProfile.rawValue, targets: [ .interface( module: .feature(.FeatureProfile), dependencies: [.shared(target: .SharedKit)] ), .implements( module: .feature(.FeatureProfile), dependencies: [ .feature(target: .FeatureProfile, type: .interface), .shared(target: .SharedKit), .core(target: .CoreNetwork), .core(target: .CoreDesignSystem), // 유일한 피처 간 의존 - Interface에만 .feature(target: .FeatureAuth, type: .interface) ] ), .testing(/* Stub 공개 */), .tests(/* Testing 재사용 */), .demo(/* 단독 실행 앱 */) ] )