하루를살자

[iOS] MVVM + Clean Architecture [1] 본문

Architecture

[iOS] MVVM + Clean Architecture [1]

Kai1996 2022. 8. 15. 23:36

이 포스트 시리즈 에선 MVVM 과 Clean Architecture 를 사용한 프로젝트 예시 를 보며 적용 방식을 이해하고 직접 만든 프로젝트를 리팩토링하는 시간을 가질예정 입니다.

Clean Architecture 란?

프로젝트를 진행하다보면 나도 모르게 같은 코드를 다른곳에서 다시 쓰고 있고, 기능을 추가 하거나 수정해야할시 어디서부터 무었을 건드려야할지 모를때가 있다. 이런경우는 흔하게 발생하고 실제로 기능하나를 추가 하기 위해서 처음부터 다시 프로그램을 작성해야하는 상황도 번번히 나오고 있다.

 

이런경우를 미연에 방지하기 위해서 software 엔지니어들은 다양한 방법을 고안했는데, 이중 Robert Cecil Martin 라는 사람이 프로그램을 작성하는 것은 마치 건물을 짓는것과 같은 행위라고 생각했고, 이를 소프트웨어 공학에 적용하게 된다.

 

건물의 용도에 따라 설계가 달라지고, 사람들은 그 설계도만 보아도 해당 건물이 어떤 역할을 하는 건물인지 딱 알수 있다. 이와 같이 프로그램도 설계만 보았을때 어떤 역할을 하는 프로그램인지 한눈에 딱 볼수있고, 전체적인 설계의 흐름을 쉽고 빠르게 이해할수 있는 방법을 고안한 끝에 Clean Architecture 라는 계념을 전파하게 된다.

Clean Architecture

MVVM + Clean Architecture

Clean Architecture 는 크게 3가지의 layer 를 갖는다. 위 그래프에서 볼수 있듯이 presentation 과 data Layer 는 원 외부에 해당하고 domain 은 원 안쪽에 위치하고 있는것을 볼수 있다. 각각의 레이어는 책임과 역할을 나누어서 갖는데, 위 그래프는 의존성이 바깥에서 부터 안쪽으로 갖는다는것을 보여준다.  

 

Domain layer

  • Domain layer 를 중점으로 Presentation, Data Layer 들이 의존하는 형태이다.
    • 이렇게 domain 중심으로 설계를 한다면 Usecase 만 보고도 프로젝트 를 쉽게 이해할수 있기 때문이다.
    • 아무런 의존성을 가지고 있지 않는 Domain layer 의 비즈니스로직만 테스트하면 되기때문에, database, 혹은 network connection 이 없어도 간단한 unit test 를 진행할수 있어진다.이렇게 layer 를 정해놓고 분리 시켜놓으면 Domain layer 의 재사용성이 높아지고 test 를 하기 빠르고 간편해진다.
  • UseCase 란? 
    • 어떠한 시스템의 의도,목적을 뚜렸하게 전달해주는 클린 아키텍쳐가 가지고 있는 핵심 요소중 하나 이다.
    • 사용자가 프로그램으로 할수있는 기능을 '행동' 으로 표현하고 인터페이스에 간결한 Input & Output 을 사용하여 표현한다.
    • Clean Architecture 의 Domain Layer 에 해당하며 Presenetation layer  Data Layer 사이의 비지니스 로직을 담당한다.

Presentation Layer

  • UI 기반 의 View 를 포함하고 있다.
  • View 들은 viewModel 에 의해 편성된다.
  • ViewModel 은 하나 또는 다수의 Usecase 를 실행시킨다
  • Presentation layer 는 오직 domain layer 를 의존한다.

Data Layer

  • Repository 와 DataSource 를 포함한다.
  • Repository 는 데이터를 dataSoruce 로 부터 가져오는 책임을 갖는다.
  • DataSource 는 remote, local 일수 있다.
  • DataLayer 는 오직 Domain Layer 를 의존한다.
  • DataLayer 에 JSON 데이터를 decodable 한 domain 모델로 맵핑시키는 역할도 해줄수 있다.

 DataFlow

  • View 는 ViewModel 에 있는 메서드 들을 호출 한다.
  • ViewModel 은 Usecase 들을 실행한다.
  • Usecase 는 유저에서 부터 전해진 데이터와 repository 에서 부터 온 데이터를 합친다.
  • 각 repository 는 Remote/local DB 로 부터 데이터 를 반환한다.

Dependency Direction

  • Presentation Layer -> Domain Layer <- Data Repositories Layer 형태의 dependency 방향을 갖는다.
  • Presentation Layer (MVVM) = ViewModels(presenters) + Views(UI)
  • Domain Layer = Entities + Usecases + Repositories Interface
  • Data Repositories Layer = Repositories Implementations + API(Network) + Presistence DB

 

 

본 내용은 아래 링크를 참조 했습니다.
 

Clean Architecture and MVVM on iOS

When we develop software it is important to not only use design patterns, but also architectural patterns. There are many different…

tech.olx.com

Comments