Skip to content

1. 프로젝트 모듈화 여정

Mase edited this page Jul 2, 2023 · 4 revisions

초기 Layering 및 모듈화 구조

초기 모듈화 구상 - 관련 PR

Presentation Layer / Domain Layer / Data Layer를 일괄적으로 모듈화

해당 모듈화 구조는 아래와 같은 문제점이 있었습니다.

  • 형식적인 Layer별 모듈화로, 공통으로 사용되는 Data Layer를 제외하곤 사실상 모듈화의 이점이 없음
  • Presentation Layer 전체를 하나의 모듈로 묶으므로, 전혀 연관이 없는 서로 다른 화면을 따로 개발할 때에도 같은 모듈을 쓰게됨




Layering 및 모듈화 구조 개선 과정

1차 개선 - 관련 PR

기존에 단순히 수평적으로 일괄적 Layering을 적용하던 방식에서, 개발 단위(화면 단위)별 Feature를 정의함

기존 방식 - 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

Coordinator를 별도의 모듈로 분리

  • 1차 개선 때 Coordinator 모듈을 Presentation 모듈 안으로 통합시켰는데, 이에 따른 문제가 발생했습니다.

  • A Coordinator(A Presentation 모듈에 존재)가 B Coordinator(B Presentation 모듈에 존재)를 호출하기 위해
    A Presentation 모듈 전체가 B Presentation 모듈 전체에 대한 의존성을 가져야하는 문제가 있었습니다.

  • A Coordinator는 B Coordinator만 알면 될 뿐, B ViewController와 B ViewModel은 알 필요가 없음 - 불필요한 의존성 발생 CleanShot 2023-05-10 at 11 32 58@2x

  • Presentation 모듈이 갖는 화면 전환(Coordinator) 책임을 별도의 모듈로 분리하여, Coordinator 모듈만 의존하면 되도록 개선했습니다.
    CleanShot 2023-05-10 at 11 37 00@2x

  • 이 과정에서 Presentation 모듈과 Coordinator 모듈간 의존성 순환 문제가 발생합니다.
    CleanShot 2023-05-10 at 11 22 32@2x

  • 이를 해결하기 위해, 두 모듈 사이에 Interface 모듈을 두어 의존성을 역전하고 순환을 제거했습니다.
    CleanShot 2023-05-10 at 13 22 21 2@2x new




3차 개선 - 관련 PR

DesignSystem 모듈에 대한 RxSwift 의존성 관리

  • DesignSystem 모듈은 화면에 표시되는 UI 컴포넌트(예: 버튼, 라벨, 이미지 등)를 담당하는데,
    해당 컴포넌트들에 대한 RxSwift Reactive 확장을 위해 DesignSystemReactive 모듈을 분리하여 구현했습니다.
  • 이러한 분리를 통해, UI 컴포넌트의 디자인과 이벤트 처리를 별도의 모듈로 관리하여
    UI 컴포넌트와 이벤트 처리 로직 간의 의존성을 없앨 수 있었습니다.
  • 이는 향후 UI 컴포넌트나 이벤트 처리 로직의 변경이 다른 부분에 미치는 영향을 최소화하는데 기여합니다.

CoreEntity 모듈에 대한 UI 관련 코드 관리

  • 일관된 의존성 방향을 지키기 위해, CoreEntity 타입에 대응되는 UI 관련 타입을 ViewController에서 맵핑하고 있었습니다.
    (CoreEntity-Domain Layer-가 UI 관련 타입에 대한 의존성을 가져선 안되므로)
  • 문제는 이러한 맵핑 코드를 각각의 ViewController마다 작성하게 되었고,
    이는 코드 재사용성을 떨어뜨리고 유지보수와 확장성 측면에서 비효율적입니다.
  • 따라서 해당 맵핑 작업을 수행하는 공통 모듈을 만들어 재사용성과 유지보수성을 개선했습니다.




작성자: Mase