[Architecture] Matching Cocoa-MVC architecture in a modular architecture

2024. 5. 22. 10:59🍏/Swift

https://github.com/chanheki/swifty-proteins

현재는 pirvate 이지만 완성 후 public으로 공개 예정 레포지토리입니다.

위 프로젝트에서 Modular architecture를 적용하여 설계, 구현하고 있습니다.
레이어별로 모듈화를 나누고 Cocoa-MVC 패턴을 적용하기 위해 정리한 내용입니다. 

https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html#//apple_ref/doc/uid/TP40010810-CH14


모듈러 아키텍처 설계

  1. App Layer
    • 앱의 진입점 및 전체적인 앱 라이프사이클 관리
    • 주요 앱 설정 및 초기화 코드
  2. Feature Layer
    • 사용자 인터페이스 및 사용자의 액션을 처리
    • 뷰(View) 및 뷰와 관련된 로직
    • 각 기능별로 독립적인 UI 및 로직 (AuthFeature, ProfileFeature 등)
  3. Domain Layer
    • 비즈니스 로직과 애플리케이션의 도메인 모델
    • 엔터티, 유스케이스, 리포지토리 인터페이스 등
    • 비즈니스 로직 및 ViewModel 역할
  4. Core Layer
    • 앱의 비즈니스를 포함하지 않는 순수 기능성 모듈
    • 네트워킹, 데이터베이스, 바이오메트릭스 등 (NetworkingModule, DatabaseModule 등)
  5. Shared Layer
    • 공용으로 사용되는 모델, 유틸리티, 확장 기능 등
    • 로깅, 확장 기능, 공통 유틸리티 (UtilityModule, LoggingModule 등)
  6. Shared (UserInterface) Layer
    • 공용 뷰, 디자인 시스템, 리소스 등 UI 요소
    • 디자인 시스템, 공용 뷰 요소 (DesignSystem, LocalizableManager 등)

Cocoa-MVC와 모듈러 아키텍처의 매칭

Model

  • Domain Layer
    • 도메인 모델 및 비즈니스 로직
    • 엔터티, 유스케이스, 리포지토리 인터페이스 등
    • 예: AuthDomain, ProfileDomain, ProteinDomain
  • Shared Layer
    • 공용 모델 정의
    • 예: ProteinModel 등

View

  • Feature Layer
    • 사용자 인터페이스 및 뷰 로직
    • 뷰를 구성하는 UI 컴포넌트
    • 예: AuthFeature, ProfileFeature, ProteinFeature
  • Shared (UserInterface) Layer
    • 공용 뷰 요소 및 디자인 시스템
    • 예: DesignSystem, LocalizableManager

Controller

  • Feature Layer
    • 사용자 액션을 처리하고 뷰와 상호작용하는 로직
    • 컨트롤러 역할을 담당하는 뷰 컨트롤러
    • 예: AuthFeature 내의 AuthViewController, ProteinFeature 내의 ProteinViewController

매칭 예시

Model (Domain Layer, Shared Layer)

Domain Layer
   |
   |-- AuthDomain
   |-- ProteinDomain
   |
Shared Layer
   |
   |-- ProteinModel
   |-- UtilityModule
   |-- LoggingModule

 

View (Feature Layer, Shared (UserInterface) Layer)

Feature Layer
   |
   |-- AuthFeature
   |-- ProfileFeature
   |-- ProteinFeature
   |
Shared (UserInterface) Layer
   |
   |-- DesignSystem
   |-- LocalizableManager

 

Controller (Feature Layer)

Feature Layer
   |
   |-- AuthFeature
       |-- AuthViewController
   |-- ProfileFeature
       |-- ProfileViewController
   |-- ProteinFeature
       |-- ProteinViewController