본문 바로가기
Swift

SwiftUI: SwiftUI + Combine MVVM 아키텍쳐 분석 - 1

by songmoro 2024. 10. 21.
728x90

Overview

 

 

기능

  • 바닐라 SwiftUI + Combine
  • Presentation, Business Logic, Data Access 계층 분리
  • UI를 포함한 풀 테스트 커버리지
  • 진실 단일 소스(Single source of truth)로서 Redux-like 중앙 집중식 AppState
  • CoreData를 사용한 데이터 저장
  • 네이티브 SwiftUI 종속성 주입
  • 프로그래밍 네비게이션, 딥 링크 푸시
  • 제네릭으로 구현된 간단, 유연한 네트워킹 레이어
  • 시스템 이벤트 처리(ex. didBecomeActive, willResignActive)
  • SOLID, DRY, KISS, YAGNI 염두
  • 확장성 염두 설계

 

 

계층 구조

3개의 레이어로 나뉜다.

  • Presentation
  • Business Logic
  • Data Access

 

Presentation Layer

뷰는 비즈니스 로직을 포함하지 않고, 함수의 상태이다.

 

사이드 이펙트가 버튼 탭과 같은 사용자의 행동(action) 혹은 뷰 라이프 사이클 이벤트인 onAppear에 의해 트리거되어 뷰 모델로 전달된다.

 

뷰 모델(ViewModel)은 뷰의 데이터 소스 역할을 하며, 생성자 매개 변수로 뷰에 주입된다.

 

 

Business Logic Layer

비즈니스 로직 레이어는 뷰 모델과 서비스(Service)를 나타낸다.

 

서비스는 외부 소스에서 데이터를 얻거나 계산하는 등의 작업을 수행하라는 요청을 받으며, 데이터를 직접 반환하지 않는다.
대신, 작업의 결과를 AppState 혹은 Binding으로 전달한다.
후자(바인딩)는 작업 결과인 데이터가 하나의 뷰 모델에서 로컬로 사용되며, AppState에 속하지 않을 때 사용된다.

 

뷰 모델은 뷰와 서비스 사이의 중개자 역할을 한다.
뷰에 로컬 비즈니스 로직을 캡슐화하며, AppState의 변화를 관찰하고 있다가 바인딩을 통해 뷰에 최신 데이터를 제공한다.

 

persistence 계층이 있는 버전과 없는 버전이 있다.

  • persistence 없는 버전
    • 모든 로드된 데이터를 AppState에 저장
    • 데이터가 많지 않을 때 적합
      • ex. 마지막으로 사용한 로그인 이메일을 유저 디폴트에 저장할 때
      • 로그인 이메일 값이 실행 시 AppState에 로드되고, 사용자가 입력을 변경할 때 서비스에 의해 업데이트
  • persistence 있는 버전
    • DB 콘텐츠를 AppState에 로드하거나, 바인딩을 통해 주문형으로 서비스에서 데이터 제공
    • 데이터가 많을 때 적합
      • ex. 데이터의 양이 방대하고, 로컬에 저장하기 위해서 데이터베이스를 도입할 때

 

 

Data Access Layer

데이터 액세스 레이어는 저장소(Repository)를 나타낸다.

 

저장소는 백엔드 혹은 로컬 데이터베이스에서 CRUD 작업을 수행하기 위해 비동기 API(콤바인 퍼블리셔)를 제공한다.
비즈니스 로직을 포함하지 않으며, AppState를 변경하지 않는다.

 

저장소는 서비스에서만 액세스하고 사용할 수 있다.

728x90