-
Notifications
You must be signed in to change notification settings - Fork 1
1. 프로젝트 모듈화 여정
Mase edited this page Jul 2, 2023
·
4 revisions
초기 모듈화 구상 - 관련 PR
![](https://private-user-images.githubusercontent.com/57667738/249091736-caf5034e-5536-47f1-95cd-7be2af897ac0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NzA1ODEsIm5iZiI6MTczOTY3MDI4MSwicGF0aCI6Ii81NzY2NzczOC8yNDkwOTE3MzYtY2FmNTAzNGUtNTUzNi00N2YxLTk1Y2QtN2JlMmFmODk3YWMwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE2VDAxNDQ0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIzMDExY2Y4ZjhjNjk3NDM2Y2EzMzk0NTBhYjEwNThlNDZlYmQzMzI5YTUwNTBkZDk2MDZiNjY4MGZlYTcyNGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.8Kd_H-duBxHaqZssaF6DGrzaoRn4RhlXdo9Z1ir5KOo)
해당 모듈화 구조는 아래와 같은 문제점이 있었습니다.
- 형식적인 Layer별 모듈화로, 공통으로 사용되는 Data Layer를 제외하곤 사실상 모듈화의 이점이 없음
- Presentation Layer 전체를 하나의 모듈로 묶으므로, 전혀 연관이 없는 서로 다른 화면을 따로 개발할 때에도 같은 모듈을 쓰게됨
![](https://user-images.githubusercontent.com/57667738/233821325-79e42bc5-c82d-49cc-8feb-10316481ed8f.png)
![](https://user-images.githubusercontent.com/57667738/235183419-48098afa-5a88-4b52-a30e-d9241be7a7eb.png)
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 모듈 안에 포함되도록 변경
![](https://user-images.githubusercontent.com/57667738/235355877-dcb15c69-6e56-4654-b8ff-107b0d600451.png)
위 과정에서 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마다 작성하게 되었고,
이는 코드 재사용성을 떨어뜨리고 유지보수와 확장성 측면에서 비효율적입니다. - 따라서 해당 맵핑 작업을 수행하는 공통 모듈을 만들어 재사용성과 유지보수성을 개선했습니다.
작성자: Mase