와챠의 우당탕탕 코딩 일기장

[Android] Clean Architecture / MVVM 본문

코딩 일기장/Android(Kotlin)

[Android] Clean Architecture / MVVM

minWachya 2022. 7. 16. 17:02
반응형

목차

1. Clean Architecture 간단 설명2. MVVM 설명3. MVVM을 사용한 Clean Architecture 설명4. 프로젝트에서 Clean Architecture를 사용하는 법


글 작성에 앞서, 전에 작성한 앱 아키텍처 내용을 다시 한 번 숙지하면 좋을 것 같아서 링크 달아둠!https://min-wachya.tistory.com/209

 

[Android/Kotlin]Udemy 강의 정리: #8: App Architecture with Android Jetpack(1) (UI Layer, Data Layer)

목차 시작하기 전에 UI Layer란? ViewModel의 데이터 관리 방법 Data Layer란? UI Layer 구현법 Data Layer 구현법 ViewModelFactory 정리 1. 시작하기 전에: 아키텍처: 변경하는데 드는 비용과 관련. (공식문서)..

min-wachya.tistory.com


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 설명

 

그림 설명:

  1. 추상화 원리: 가장 추상적인 원은 중앙에, 가장 구체적인 원은 바깥쪽에 있음
    • 내부 그룹: 비즈니스 로직을 포함
    • 외부 그룹: 구현 세부 사항을 포함
  2. 의존관계 규칙: 각 원이 가장 가까운 내부 원에만 의존할 수 있음

클린 아키텍처 장점

  • 표준 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

 

GitHub - android10/Android-CleanArchitecture: This is a sample app that is part of a series of blog posts I have written about h

This is a sample app that is part of a series of blog posts I have written about how to architect an android application using Uncle Bob's clean architecture approach. - GitHub - android10/Andr...

github.com


참고

https://www.geeksforgeeks.org/introduction-to-model-view-view-model-mvvm/

 

Introduction to Model View View Model (MVVM) - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.geeksforgeeks.org/what-is-clean-architecture-in-android/

 

What is Clean Architecture in Android? - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://youngest-programming.tistory.com/484

 

[안드로이드] 클린 아키텍처(Clean Architecture) 정리 및 구현

[2021-04-28 업데이트] [2022-02-01 업데이트] Hilt 사용한 프로젝트 링크 하단에 추가 [프로젝트] github.com/mtjin/mtjin-android-clean-architecture-movieapp mtjin/mtjin-android-clean-architecture-movieap..

youngest-programming.tistory.com

https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc

 

まだMVC,MVP,MVVMで消耗してるの? iOS Clean Architectureについて - Qiita

<この記事は「Money Forward Advent Calendar 2015」の22日目の記事です> この記事は、iOS Clean Architectureと実際にコードへ適用した内容について紹介します。 コードについては、...

qiita.com

https://github.com/android10/Android-CleanArchitecture

 

GitHub - android10/Android-CleanArchitecture: This is a sample app that is part of a series of blog posts I have written about h

This is a sample app that is part of a series of blog posts I have written about how to architect an android application using Uncle Bob's clean architecture approach. - GitHub - android10/Andr...

github.com

 

반응형
Comments