와챠의 우당탕탕 코딩 일기장
[Android] Clean Architecture / MVVM 본문
목차
1. Clean Architecture 간단 설명2. MVVM 설명3. MVVM을 사용한 Clean Architecture 설명4. 프로젝트에서 Clean Architecture를 사용하는 법
글 작성에 앞서, 전에 작성한 앱 아키텍처 내용을 다시 한 번 숙지하면 좋을 것 같아서 링크 달아둠!https://min-wachya.tistory.com/209
1. Clean Architecture 간단 설명
Clean Architecture란?
- 변경이 용이하고(유연) + 의존성을 줄이고 + 테스트 가능하고 + 유지 관리 쉽게 하기 위한 개념
- 소스 코드를 보는 것만으로 프로그램이 수행하는 작업을 식별할 수 있는 소프트웨어 개발 방법
2. MVVM 설명
MVVM이란?
(Model - View - View Model)
로직을 사용자 인터페이스 제어에서 분리하는 소프트웨어 설계 프레임워크
- Model: (재사용 가능한 코드– DATA)
- 애플리케이션 도메인 데이터와 동작을 캡슐화하는 비즈니스 객체
- 데이터 보관
- View: (플랫폼 고유의 코드– USER INTERFACE )
- 사용자에게 표시되는 포맷된 데이터
- View Model: ( 재사용 가능한 코드 – LOCICIC )
- Model과 View 사이의 연결
- 또는 모델에서 데이터를 가져와 View에 표시
특징:
- 애플리케이션의 LifeCycle 상태가 유지됨
- UI 컴포넌트는 Business Logic에서 분리됨
- Business Logic은 데이터베이스 조작에서 제외됨
- 알기 쉽고 읽기 쉬움
3. MVVM을 사용한 Clean Architecture 설명
그림 설명:
- 추상화 원리: 가장 추상적인 원은 중앙에, 가장 구체적인 원은 바깥쪽에 있음
- 내부 그룹: 비즈니스 로직을 포함
- 외부 그룹: 구현 세부 사항을 포함
- 의존관계 규칙: 각 원이 가장 가까운 내부 원에만 의존할 수 있음
클린 아키텍처 장점
- 표준 MVVM보다 테스트 쉬움
- 완벽하게 큐레이션된 분리(가장 큰 장점)
- 사용하기 쉬운 패키지 구조
- 프로젝트를 쉽게 실행 가능
- 새 기능 빠르게 구현 가능
클린 아키텍처 단점
- 학습 곡선이 가파름. 모든 수준의 상호 작용 방식을 학습하는 데 시간이 걸림
- 추가 클래스가 많기 때문에 정교함이 낮은 어플리케이션에는 적합하지 않음
- Presentation: UI와 상호작용하는 레이어
- Domain: 앱의 비즈니스 로직을 저장
- Use cases: == Interactor. 각 개별 기능 또는 비즈니스 논리 단위(한 개의 행동을 담당)
- Data: 모든 데이터 소스는 넓은 의미로 정의됨
- Framework: Android SDK와의 인터페이스 및 구체적인 데이터 계층 구현 구현
1) Presentation:
UI(Activity, Fragment), Presenter 및 ViewModel을 포함
즉 화면과 입력에 대한 처리 등 UI와 직접적으로 관련된 부분을 담당함
특징: Presentation 레이어는 Domain과 Data 레이어를 포함하고 있음
2) Domain:
앱의 비즈니스 로직을 포함하고 비즈니스 로직에서 필요한 Model 과 UseCase를 포함
특징: Presentation, Data 레이어와 독립적
3) Data:
Repositoy 구현체
Cache, Room DB, Dao, Model 서버API(Retrofit2) 을 포함하고 있으며 로컬 또는 서버 API와 통신하여 데이터를 CRUD 하는 역할
Mapper 클래스 포함: DB로 부터 받아온 데이터 모델과 UI에 맞는 데이터 모델 간의 변환
특징: Domain 레이어를 포함
이 그림의 흐름대로 클린 아키텍처를 설명해보려고 한다,,!!!
(이 글의 내용을 번역 + 내가 이해한대로 정리해봤다.)
1. Presentation layer
- 사용자가 UI와의 상호작용을 한다(Event 등).
1-1. View (ViewController)
- 화면 표시, 사용자의 터치 이벤트 등의 Event를 Presenter에 통지한다.
- Presenter에서 받은 Model의 data나 Status에 따라 View의 표시를 바꾼다(ex. TextView의 text 갱신...).
1-2. Presenter
- View에서 Event를 받고, 필요하면 Event에 응하는 UseCase를 실행한다.
- UseCase에서 받은 data를 View에 보낸다.
- (View가 어떤 구성으로 되어있는 알지 못한다.)
2. Domain layer
- 앱 비즈니스 로직을 당담한다.
2-1. UseCase
- UseCase에 필요한 로직 처리를 기술한다.
- 어떤 데이터를 어떻게 받아올지 기술
- UI에 직접 관여하지 않는다(View, ViewController에서 직접 참조되지 않음).
2-2. Translater
- UseCase에서 얻은 Entity를 Presentation layer에서 사용하는 Model로 변환한다.
- View에서 사용하기 위해서 최적화된 Model을 작성한다.
2-3. Repository
- UseCase에서 얻고자 하는 data의 CRUD I/F를 기술한다.
- 데이터를 얻는 데에 필요한 DataStore에 데이터 처리 요청을 한다.
- (Repository는 데이터를 다루는 I/F를 정의하지만, 어떻게 데이터를 다룰지는 모른다.)
- (Domain layer으로 기술했지만, Domain층과 Data층의 I/F이다.)
3. Data layer
- 통신과 데이터 관리의 논리를 담당한다.
3-1. DataStore
- data를 실제로 얻고, 갱신하는 처리를 기술한다.
- 서버로부터 data를 얻을지, DB나 Cash의 데이터를 사용할지도 여기서 판단한다.
- 여러 DataStore를 다루는 경우는 Factory 패턴을 이용하여 Repository가 Data 종별을 의식하지 않는 설계로 구현한다.
3-2. Entity
- DataStore에서 다룰 수 데이터의 정적인 모델이다.
- Entity를 직접 조작하지 않고, Value object로 사용한다.
- (Entity는 Presentation layer에서 사용되지 않음)
4. 프로젝트에서 Clean Architecture를 사용하는 법
패키지 구조를 아래와 같이 하고, 각 패키지에 맞게 클래스/인터페이스 등을 작성하면 된다.
(!! 패키지 구조와 이름은 사용하는 사람에 따라 달라질 수 있음 !!)
- presentation
- views
- base
- utils
- di
- module
- domain
- repository
- api
- db
- model
- mapper
- utils
- data
- remote
- repository
구현 내용은,,, 정말 다들 달라서
android clean architecture package structure<구글링해서 살펴보면 좋을 거 같다!!
아래 깃허브에서 클린 아키텍처를 사용해서 프로젝트를 구성한 자세한 내용을 확인할 수 있다.
(내 깃허브 아님)
https://github.com/android10/Android-CleanArchitecture
참고
https://www.geeksforgeeks.org/introduction-to-model-view-view-model-mvvm/
https://www.geeksforgeeks.org/what-is-clean-architecture-in-android/
https://youngest-programming.tistory.com/484
https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc
https://github.com/android10/Android-CleanArchitecture