일반적인 Android 앱은 여러 구성요소를 포함할 수 있고, 사용자는 짧은 시간 내에 여러 앱과 상호작용할 때가 많다는 점을 고려하면, 앱은 사용자 중심의 다양한 워크플로 및 작업에 맞게 조정될 수 있어야한다.
앱 구성요소는 개별적이고 비순차적으로 실행될 수 있으며, 운영체제나 사용자가 언제든지 앱 구성요소를 소멸시킬 수 있다. 이러한 이벤트는 직접 제어할 수 없기때문에 앱 구성요소에 애플리케이션 데이터나 상태를 저장해서는 안되고, 앱 구성요소가 서로 종속되면 안된다.
Android 앱은 크기가 커지기 때문에 앱을 확장하고 앱의 견고성을 높이며 앱을 더 쉽게 테스트할 수 있도록 아키텍처를 정의하는 것이 중요하다.
처음 안드로이드를 시작했다면, Activity나 Fragment에 모든 코드를 작성하기도 한다. (내가 그러했듯이..) UI 기반의 클래스는 UI 및 운영체제 상호작용을 처리하는 로직만 포함해야 한다.
💡 UI 기반의 클래스는 최대한 가볍게 유지하기운영체제는 사용자 상호작용을 기반으로 또는 메모리 부족과 같은 시스템 조건으로 인해서 언제든지 클래스를 소멸시킬 수 있다.
→ 그러므로, UI 클래스에 대한 의존성을 최소화하는 것이 중요하다
데이터 모델은 앱의 데이터를 나타낸다. 이 모델은UI 요소 및 기타 구성요소로부터 독립되어 있다. UI 앱 구성요소 수명주기와는 관련이 없다.
UI 모델은 가급적 지속적인 모델을 권장하는데 그 이유는 Android 운영체제에서 리소스를 확보하기 위해 앱을 제거해도 사용자 데이터가 삭제되지 않는 다는 점, 네트워크 연결이 취약하거나 연결되어 있지 않아도 앱이 계속 작동한다는 점이다.
앱에서 새로운 데이터 유형을 정의할 때는 데이터 유형에 단일 소스 저장소 SSOT(Single Source of Truth)를 할당해야 한다.
SSOT는
덕분에, 특정 유형 데이터의 모든 변경사항을 한 곳에서 확인할 수 있고 다른 유형이 조작할 수 없도록 데이터를 보호한다는 장점이 있다. 데이터 변경사항을 더 쉽게 추적할 수 있게 하여 버그를 발견하기 쉽다.
SSOT는 Google 가이드에서 종종 단방향 데이터 흐름 UDF (Unidirectional Data Flow)패턴과 함께 사용된다.
💡 UDF에서 상태는 한 방향으로 흐르고 데이터를 수정하는 이벤트는 반대 방향으로 흐른다.예를 들어, 버튼을 누르는 것과 같은 사용자 이벤트는 UI → SSOT로 흐른다.
→ 데이터 일관성을 강화하고, 디버그하기 쉽다.

각 애플리케이션에는 최소 두가지 레이어가 포함되어야 한다.
이 화살표들은 모듈들 간의 의존관계를 뜻한다.
Domain Layer는 써있는 것처럼 optional이다. UI와 데이터 레이어 간의 상호작용을 간소화하고 재사용하기 위해 쓰인다. 이후 자세히 다뤄보기로 하자.
위에서 알아본 단방향 데이터 흐름과 위 그림을 연결해보면 단방향 데이터 흐름에는 2가지 방식이 있다. Up Stream 방식과 Down Stream 방식이다.
ex) 사용자의 클릭 이벤트
UI → Domain → Data (상위 레이어로 전달)

ex) Remote 또는 서버로부터 받은 Data → Domain → UI (하위 레이어로 전달)

( = presentation Layer라고도 불린다 )
화면에 애플리케이션 데이터를 표시하는 것이다.
사용자 상호작용, 외부입력으로 인해 데이터가 변할 때마다 변경사항을 반영하도록 UI가 업데이트 되어야 한다.

앱의 데이터 레이어에는 비지니스 로직이 포함되어있다.
비지니스 로직이란, 앱의 가치를 부여하는 요소로 앱의 데이터 생성, 저장, 변경 방식을 결정하는 규칙으로 구성된다.
데이터 레이어는 0개부터 데이터 소스를 포함할 수 있는 저장소로 구성된다. 앱에서 데이터를 처리하는 다양한 유형별로 저장소 클래스를 만든다. (각 유형별로 맞는 데이터 클래스가 생긴다는 것)

예를 들어, 영화 관련 데이터에는 MoviesRepository를 결제 관련 데이터는 PaymentRepository 클래스를 만들 수 있다.
여기서 Data Source와 Repositories의 관계를 살펴보자

옷 주문이 들어왔을 때, DataSource에 옷을 만들기 위해 필요한 실과 바늘을 요청한다.

이후 각 공장에서 실과 바늘을 받아 옷 공장에서 옷을 만든다.
이 과정이 데이터 가공이고, 이를 하위 레이어에게 제공까지 한다.
즉, DataSource는 서버로부터 받은 데이터를 Repository로 보내고 Repository는 받은 데이터를 가공하여 하위 레이어로 보내주는 역할을 한다.
아까 말했던 선택적 레이어이다.
도메인 레이어는 복잡한 비지니스 로직이나 여러 ViewModel에서 재사용되는 간단한 비지니스 로직의 캡슐화를 담당한다. 필수적은 것은 아니나 복잡성을 처리하거나 재사용성을 선호하는 등 필요한 경우에 도메인 레이어를 사용하면 좋다고 한다.