-
Notifications
You must be signed in to change notification settings - Fork 1
1. 프로젝트 모듈화 여정
Mase edited this page Jun 30, 2023
·
4 revisions
초기 모듈화 구상 - 관련 PR

해당 모듈화 구조는는 아래와 같은 문제점이 있었습니다.
- 형식적인 Layer별 모듈화로, 공통으로 사용되는 Data Layer를 제외하곤 사실상 모듈화의 이점이 없음
- Presentation Layer 전체를 하나의 모듈로 묶으므로, 전혀 연관이 없는 서로 다른 화면을 따로 개발할 때에도 같은 모듈을 쓰게됨


1차 개선 - 관련 PR
기존 방식 - Layer 단위 모듈화 | 개선된 방식 - Feature 단위로 모듈 분리후 Layer 단위 모듈화 |
---|---|
![]() |
![]() |
기존 구조의 문제를 개선하기 위해 아래와 같은 변경을 적용했습니다.
- 기능 개발 단위를 Feature로 정의하고, 각 Feature에 대한 Presentation Layer / UseCase Layer / Repository Layer 레이어링 및 모듈화
- DI Container 모듈 구현, 나머지 Layer들이 의존성 주입을 필요로 할 경우 해당 모듈을 사용
- 공통으로 사용되는 UseCase와 Repository의 경우 Shared 모듈로 분리하여 의존성 관리
- Core 모듈을 구현하여 Service Layer 구현
- UI Component만 관리하는 DesignSystem 모듈 구현
- Coordinator는 Presentation 모듈 안에 포함되도록 변경

위 과정에서 Core 모듈이 지나치게 세분화 되어있어 의존성 관리가 복잡해지는 문제가 발생, 통합이 가능한 모듈에 대해서는 통합하여 간소화했습니다.
Core 모듈 간소화 이전 | Core 모듈 간소화 이후 |
---|---|
![]() |
![]() |
2차 개선 - 관련 PR
-
1차 개선 때 Coordinator 모듈을 Presentation 모듈 안으로 통합시켰는데, 이에 따른 문제가 발생했습니다.
-
A Coordinator(A Presentation 모듈에 존재)가 B Coordinator(B Presentation 모듈에 존재)를 호출하기 위해
A Presentation 모듈 전체가 B Presentation 모듈 전체에 대한 의존성을 가져야하는 문제가 있었습니다. -
A Coordinator는 B Coordinator만 알면 될 뿐, B ViewController와 B ViewModel은 알 필요가 없음 - 불필요한 의존성 발생
-
Presentation 모듈이 갖는 화면 전환(Coordinator) 책임을 별도의 모듈로 분리하여, Coordinator 모듈만 의존하면 되도록 개선했습니다.
-
이 과정에서 Presentation 모듈과 Coordinator 모듈간 의존성 순환 문제가 발생합니다.
-
이를 해결하기 위해, 두 모듈 사이에 Interface 모듈을 두어 의존성을 역전하고 순환을 제거했습니다.
3차 개선 - 관련 PR
- DesignSystem 모듈은 화면에 표시되는 UI 컴포넌트(예: 버튼, 라벨, 이미지 등)를 담당하는데,
해당 컴포넌트들에 대한 RxSwift Reactive 확장을 위해 DesignSystemReactive 모듈을 분리하여 구현했습니다. - 이러한 분리를 통해, UI 컴포넌트의 디자인과 이벤트 처리를 별도의 모듈로 관리하여
UI 컴포넌트와 이벤트 처리 로직 간의 의존성을 없앨 수 있었습니다. - 이는 향후 UI 컴포넌트나 이벤트 처리 로직의 변경이 다른 부분에 미치는 영향을 최소화하는데 기여합니다.
- 일관된 의존성 방향을 지키기 위해, CoreEntity 타입에 대응되는 UI 관련 타입을 ViewController에서 맵핑하고 있었습니다.
(CoreEntity-Domain Layer-가 UI 관련 타입에 대한 의존성을 가져선 안되므로) - 문제는 이러한 맵핑 코드를 각각의 ViewController마다 작성하게 되었고,
이는 코드 재사용성을 떨어뜨리고 유지보수와 확장성 측면에서 비효율적입니다. - 따라서 해당 맵핑 작업을 수행하는 공통 모듈을 만들어 재사용성과 유지보수성을 개선했습니다.