Android/학습

[Android] Android 권장 앱 아키텍처를 통해 보는 ViewModel과 Repository

한때미 2022. 9. 18. 15:30

아키텍처 원칙

 

앱 구성요소 : Activity, Fragment, Service, Content Provider, Broadcast Receiver 등

  • 구성요소는 개별적이고 비순차적으로 실행될 수 있음.
  • 운영체제나 사용자가 언제든지 앱 구성요소를 제거 가능.

 

애플리케이션 데이터나 상태를 저장 ❌
서로 종속 ❌

 

Activity  Fragment 구현은 소유 대상이 아니며 Android OS와 앱 사이의 계약을 나타내도록 이어주는 클래스

OS는 사용자 상호작용을 기반으로 또는 메모리 부족과 같은 시스템 조건으로 인해 언제든지 클래스를 제거 가능

 


권장 앱 아키텍처

 

  • UI 레이어 : 화면에 애플리케이션 데이터를 표시
  • 데이터 레이어 : 앱의 비즈니스 로직을 포함하고 애플리케이션 데이터를 노출

 

UI와 데이터 레이어 간의 상호작용을 간소화하고 재사용하기 위한 도메인 레이어라는 레이어를 추가

 

일반적인 앱 아키텍처 다이어그램

 

 

 

화살표는 종속성을 표시. 즉, 도메인 레이아웃은 데이터 레이아웃에 종속된다.

 

 

 


 

UI 레이아웃(프레젠테이션 레이아웃)

 

 

역할 :  화면에 애플리케이션 데이터를 표시

  • 사용자 상호작용(예: 버튼 누르기)
  • 외부 입력(예: 네트워크 응답)

다음과 같은 상황에서 데이터가 변할 때마다 변경사항을 반영하도록 UI가 업데이트

 

 

앱 아키텍처에서 UI 레이어의 역할

 

  • 데이터를 보유하고 이를 UI에 노출하며 로직을 처리하는 상태 홀더(예: ViewModel 클래스)

 

 


UI는 데이터 계층(데이터 레이아웃)에서 검색된 애플리케이션 상태를 시작적으로 표현한 것

 

 

 

 

UI 계층은 다음 단계를 수행

  1. 앱 데이터를 사용하여, UI가 쉽게 렌더링 가능한 데이터로 변환
  2. UI 렌더링 가능한 데이터를 사용하여, 사용자에게 표시하기 위한 UI 요소로 변환
  3. 조립된 UI 요소에서 사용자 입력 이벤트 사용하며, 필요에 따라 UI 데이터에 해당 효과 반영
  4. 필요한 만큼 1 ~ 3 단계 반복

 

UI 상태 : 앱에서 사용자가 봐야 할 것

UI : UI 상태를 시작적으로 표현한 것

UI는 화면의 UI 요소를 UI 상태로 바인딩한 결과입니다.

 

 

 

State holder(상태 보유자)

 

UI 상태 생성을 담당하고 해당 작업에 필요한 논리를 포함하는 클래스

ex) 하단 앱 바(단일 위젯), 전체 화면, 탐색 대상 등

 

 

일반적으로 ViewModel로 구현.

ViewModel
데이터 계층에 대한 액세스 권한이 있는 '화면 수준 UI 상태 관리'에 권장되는 구현
앱의 이벤트에 적용할 로직 정의하고 결과의 '업데이트된 상태'를 생성

 

앱 아키텍처에서 UDF(단방향 데이터 흐름)의 작동 방식을 보여주는 다이어그램

 

 


 

데이터 레이아웃

 

 

 비즈니스 로직(앱의 데이터 생성, 저장, 변경 방식을 결정하는 규칙)이 포함

구성 : 0 ~ N개의 데이터 소스를 포함할 수 있는 저장소

DataSource 객체: Connection pool을 관리하기 위한  목적으로 사용
각 데이터소스 클래스는 파일, 네트워크 소스, 로컬 데이터베이스와 같은 하나의 데이터 소스만 사용.
데이터 작업을 위한 시스템과 애플리케이션 사이의 다리 역할.

 

 

앱에서 처리하는 다양한 유형의 데이터별 저장소 클래스 존재

  • 영화 관련 데이터 클래스 : MoviesRepository
  • 결제 관련 데이터 클래스 : PaymentsRepository
항상 레포지토리 클래스를 통해 데이터 소스를 엑세스

 

 

저장소 클래스 담당 작업

  • 앱의 나머지 부분에 데이터 노출
  • 데이터 변경사항을 한곳에 집중
  • 여러 데이터 소스 간의 충돌 해결
  • 앱의 나머지 부분에서 데이터 소스 추상화
  • 비즈니스 로직 포함

 

앱 아키텍처에서 데이터 레이어의 역할

 

 


이러한 관심의 분리를 통해..

데이터 레이어를 여러 화면에 사용, 앱의 다른 부분 간에 정보를 공유, 단위 테스트를 위한 UI 외부에서 비지니스 로직을 재현 가능

 

 

 

 


 

여기서 정리하는 ViewModel과 Repository의 차이...

 

 

 

 

ViewModel은 UI 레이아웃의 State Hodler의 구현 방식으로 UI의 조작을 담당한다.

 

 

 

Repository는 Data 레이아웃에서 사용하는 패턴으로 UI와는 독립된 비지니스 로직을 구현하기 위한 클래스
즉, UI와 관련된 작업 및 생애주기와 관련된 작업을 여기서 수행해서는 안된다.

 

 

 

 

 


출처 : Android Developers

 

 

https://developer.android.com/topic/architecture

 

앱 아키텍처 가이드  |  Android 개발자  |  Android Developers

앱 아키텍처 가이드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드에는 고품질의 강력한 앱을 빌드하기 위한 권장사항 및 권장 아키텍처가 포함

developer.android.com

 


권장하는 추가적인 학습 부분

 

 

https://developer.android.com/training/dependency-injection

 

Android의 종속 항목 삽입  |  Android 개발자  |  Android Developers

Android의 종속 항목 삽입 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 종속 항목 삽입(DI)은 프로그래밍에 널리 사용되는 기법으로, Android 개발에 적합합니

developer.android.com

 

https://developer.android.com/topic/libraries/architecture/viewmodel

 

ViewModel 개요  |  Android 개발자  |  Android Developers

ViewModel을 사용하면 수명 주기를 인식하는 방식으로 UI 데이터를 관리할 수 있습니다.

developer.android.com