[Android] Clean Architecture + MVVM

Delight Yoon·2023년 3월 13일
0

Android

목록 보기
13/17
post-custom-banner

📌 Clean Architecture

  • 관심사에 따라 레이어를 분리 (관심사 분리)
  • 각 레이어는 다른 레이어에 대해 독립적
  • 가장 바깥쪽의 원은 저수준의 구체적인 상세 정보를 담는다. 안쪽으로 이동해가면서 소프트웨어는 추상화 되고 고수준의 정책을 캡슐화한다
  • 소스 코드는 안쪽을 향해서만 의존할 수 있다.
  • 안쪽의 원은 바깥쪽의 원에 대해 전혀 알지 못한다. 특히, 바깥쪽의 원에서 선언된 어떠한 이름을 안쪽 원에서 참조해서는 안된다.
  • 바깥쪽 원의 어떠한 것도 안쪽의 원에 영향을 줘선 안된다.

Entities :

엔티티는 가장 일반적인 비즈니스 규칙을 캡슐화하고 DTO(Data Transfer Object)도 포함하는 전사적 비즈니스 규칙입니다. 외부가 변경되면 이러한 규칙이 변경 될 가능성이 가장 적습니다.

Use cases :

유스케이스는 Intereactor라고도 하며 소프트웨어의 애플리케이션 별 비즈니스 규칙을 나타냅니다.이 계층은 데이터베이스, 공통 프레임 워크 및 UI에 대한 변경으로부터 격리됩니다. 

Interface Adapters (Presenters) :

인터페이스 어댑터는 데이터를 Entity 및 UseCase의 편리한 형식(Format) 에서 데이터베이스 및 웹에 적용 할 수있는 형식으로 변환합니다. 이 계층에는 MVP의 Presenter, MVVM의 ViewModel 및 게이트웨이 (= Repositories)가 포함됩니다. 즉 순수한 비즈니스 로직만을 담당하는 역할을 하게 됩니다.

Frameworks & Drivers (Web, DB) :

프레임워크와 드라이버는 웹 프레임 워크, 데이터베이스, UI, HTTP 클라이언트 등으로 구성된 가장 바깥 쪽 계층입니다.

📌MVVM Pattern

ViewViewModelModel(Repository)
1. 사용자의 이벤트를 받아, ViewModel에 데이터를 요청
2. 해당 데이터를 불러오는 Model(Repository)의 메소드를 호출
3. ViewModel에서 요청하는 값을 반환
4. Model(Repository)로부터 받은 값을 LiveData에 저장
5. LiveData의 값을 Observing하여, 값이 바뀌면, View를 갱신
  • View : 사용자와 상호작용하는 UI, 데이터 변화 감지(Event 감지)를 위한 옵저버를 가짐
    • Event 발생 → LiveData Observing → LiveData의 value 변화 → View에 출력
  • ViewModel : View와 Model 사이의 인터페이스, View를 그리기 위한 데이터를 처리하는 역할
  • Model : 사용할 데이터(DTO)와 데이터를 처리(통신)하는 역할(Repository)
    • Service API, ViewModel은 DB에 직접 접근하지 않고 Repository에 접근하여 데이터를 처리할 수 있다.

📌Clean Architecture + MVVM + Android

Clean Architecture와 MVVM Pattern을 연결하여 사용하면 유지보수성이 높은 안드로이드 앱을 개발할 수 있음.

왜 MVVM 패턴을 사용할까?

MVC → View와 Controller가 모두 Activity와 Fragment와 같은 UI에서 처리되어야하기 때문에, 관심사의 분리가 비교적 원할하지 않다.

MVP → Presenter가 View와 1대1로 동작하기 때문에, View와 Presenter의 의존성이 강해지는 문제가 발생, Presenter의 로직이 비대해진다.

MVVM → View와 Model 사이에 ViewModel 을 두어 충분히 관심사를 분리할 수 있고, 화면회전 등의 동작으로 View가 다시 그려지더라도 ViewModel 을 통해 데이터를 유지할 수 있는 MVVM 방식을 채택하기로 결정.

일반적으로 Presentation, Data, Domain 총 3개의 Layer로 나눠지게 된다.

Presentation Layer

사용자 인터페이스를 관리, 사용자의 입력에 대한 반응으로 적절한 작업을 수행

  • View → Activity, Fragment

  • ViewModel

    • 클라이언트에서 요청하는 해당 데이터를 불러오는 메소드를 호출.

    • 어떠한 비즈니스 로직이 포함되어서는 안됨.

    • 인터페이스의 메서드를 호출하기만 한다.

    • 메서드의 구현체는 Data Layer에 있음.

Data Layer

  • Data Layer는 Data Source와 애플리케이션의 Use case와 Boundary 레이어 사이에서 데이터를 변환(ViewModel에서 필요로 하는 데이터로 변환)하고 반환하는 역할을 합니다.

  • Data Layer는 외부 Data Source와의 통신을 담당하며, Repository 인터페이스를 구현하여 Use case나 Boundary 레이어에서 데이터를 요청하면 해당 데이터를 반환합니다.

    • Repository Impl (구현체)

    • Data Source Impl (구현체)

    • Server API Interface

Domain Layer

  • 비즈니스 로직을 담당

  • Repository Interface

  • Data Source Interface

의존성 방향은 다음과 같다.

  • PresentationData

  • PresentationDomain

  • DataDomain

클린 아키텍처를 안드로이드에 접목시키기 위해서는?

Module을 생성하여 Presentation, Data, Domain Layer로 구분

[Android Studio]에서 [File > New > New Project]를 통해 생성 시 app 은 application 모듈을 의미한다.

[File > New > New Module] 을 통해 생성할 수 있다.

Module

소스 파일 및 빌드 설정으로 구성된 모음, 프로젝트를 별개의 기능 단위로 분할할 수 있음.

프로젝트에는 하나 이상의 모듈이 있으며, 모듈은 다른 모듈을 종속 항목으로 사용할 수 있다.

profile
Yoon's Dev Blog
post-custom-banner

0개의 댓글