INEEDACHACHA

Clean Architecture on iOS (MVVM) 본문

iOS

Clean Architecture on iOS (MVVM)

INEEDACHACHA 2024. 3. 23. 19:38

Summary

  • CleanArchitecture는 로버트 마틴이 고안한 아키텍쳐로 소프트웨어를 다양한 계층(Layer)로 분리해서 다음과 같은 목적을 추구한다.
    • 아키텍처는 소프트웨어 라이브러리의 존재 자체에 의존하지 않음
    • 비즈니스 로직은 UI, DB, 웹, 섭버 또는 기타 외부 요소 없이 테스트 할 수 있음
    • UI는 시스템을 변경하지 않고도 쉽게 변경 가능(ex. 비지니스 로직을 변경하지 않고 UI 변경 가능)
    • 비즈니스 로직이 DB에 바인딩 되지 않음
    • 비즈니스 로직은 outside world에 대해 전혀 알지 못함
  • 소프트웨어에서 맡은 역할에 따라 레이어를 나눈 후, 완전 분리시켜서 의존성을 최대한 낮추는 게 목적이다.

DataLayer

  • 데이터 레이어는 하기를 포함한다.
    • Repository 구현체
    • 여러 Data Source

Data Source

  • 데이터를 가져오는 곳을 만한다.
    • API 객체
    • 로컬 DB(CoreData, Key Chain, plist등)
    • 캐시

RepositoryImpl

  • 여러 DataSource에서 데이터를 가져오고 저장하기 위한 객체 입니다.
    • API에서 받을 경우
      • Alamofire, URLSession등 데이터를 가져오는 코드가 담겨있는 객체
    • 로컬 DB에서 데이터를 가져온다면
      • 해당 DB와 상호작용을 처리하는 코드를 구현
  1. 데이터 소스에서 받아온 데이터를 Entity로 매핑
  2. Entity에 CRUD를 수행하고, Domain Model을 변형시킨다.

++

  • Repository 구현체는 보통 Repository Interface와 함께 구현되어 Interface를 통해 데이터를 가져오는 방법을 정의한다.
  • Repository Interface는 Domain Layer의 UseCase에서 DataLayer에서 데이터를 받아올 때 발생하는 (의존성 역전)을 해결하기 위해 정의된 인터페이스이다.
  • Data Layer에서 Repository 구현체를 구현하고 Domain Layer에서 Repository Interface를 가짐으로써 Data Layer가 변경되더라도 Domain Layer에 영향을 미치지 않도록 한다.

UI Layer + Presenter Layer

View

  • ViewController, SwiftUI View, UIKit을 상속하는 모든 View Class를 말한다
  • Presenter(ViewModel)을 통해 Domain Layer에 간접적인 접근을 하는 것이 권장된다.

ViewModel

  • UI Layer를 통해 유저의 입력을 UseCase를 호출해 비즈니스 로직을 수행하는 계층
  • MVVM 패턴으로 구현되며, ViewModel에서는 UI 로직을 하지 않는 것이 좋다

Domain Layer

Domain의 개념

  • 도메인이란 소프트웨어 시스템이 구축되는 대상 영역을 말한다.
  • 데이터 거래 앱이라고 가정하면, 데이터 거래라는 도메인에 대한 지식과 요구사항을 분석하여 기능을 구현하게 된다.
  • 즉, 도메인은 앱이 제공하는 기능과 서비스의 범위를 말한다.
  • Domain Layer는 이러한 도메인 지식과 요구사항을 반영한 비즈니스 로직을 담당하는 계층이다.

Entity

  • 여러 DataSource에서 가져온 데이터 그 자체를 말한다.
  • 일반적으로 Codable을 채택하고 가져온 소스를 맵핑하는 그 객체이다.

Use Case

  • 앱의 비즈니스 로직이 정의되어 있는 객체.
  • Presenter Layer에서 호출되어 사용된다.
  • 좋은 아키텍쳐는 UseCase 중심으로 구현되어있다.

Repository Interface

  • Domain Layer에서 사용자의 요청을 처리하다보면, Data Layer에 읜존성을 갖는 의존성 역전 현상이 발생하게 된다.
  • Repository Interface를 정의하고, 구현은 Data Layer에서 구현해서 의존성 역전 현상을 해소할 수 있다.

Data Flow

  • Domain Layer는 응용프로그램의 핵심 로직을 담당하기 때문에 Presenter Layer, Data Layer 사이에서 중간 역할을 한다.
  1. Presentation Layer(View,ViewModel)에서 유저 요청을 받고
  2. Data Layer(API, Network, Domain Model)에서 데이터를 받아오고 가공하고
  3. Domain Layer(UseCasem Entity)에서 유저 요청 + 가져온 데이터를 조합한다.
  4. 사용자 요청에 맞는 데이터를 Presentation Layer로 보낸다.
  • 이를 통해 두 Layer 사이의 의존성을 낮추고, 유연성과 재사용성을 늘릴 수 있다.