액티비티, 프래그먼트에 너무 많은 코드를 넣게 되면 점점 무거워져 다루기 힘들어지게 된다.
앱이 카메라 인텐트를 트리거합니다. 그러면 Android OS에서 요청을 처리하기 위해 카메라 앱을 실행합니다. 이 시점에 사용자는 소셜 네트워크 앱에서 나간 상황이지만 사용 환경은 끊김 없이 연결됩니다.
카메라 앱은 파일 선택기 실행처럼 다른 인텐트를 트리거하여 다른 앱을 실행할 수도 있습니다.
이후에 사용자가 다시 소셜 네트워크 앱으로 돌아와서 사진을 공유합니다.
위는 구글에서 예시로 든 소셜 네트워크 앱에서 사진을 공유하면 어떻게 되는지에 대한 예제이다.
이 과정에서 언제든지 전화나 알림에 의해 사용 환경이 중단될 수 있다.
사용자는 이 중단에 대응하고 난 후에 사진 공유 프로세스로 돌아가서 작업을 계속할 수 있기를 원하기 때문에, 앱에서 이러한 흐름을 올바르게 처리해야 한다.
또한 휴대기기는 리소스가 제한되어 있으므로, 운영체제에서 새로운 앱을 위한 공간을 확보하도록 언제든지 일부 앱 프로세스를 종료해야 할 수 있다.
이러한 환경 조건을 고려해 볼 때 앱 구성요소는 개별적이고 비순차적으로 실행될 수 있으며, 운영체제나 사용자가 언제든지 앱 구성요소를 제거할 수 있다.
이러한 이벤트는 직접 제어할 수 없기 때문에앱 구성요소에 앱 데이터나 상태를 저장해서는 안 되며앱 구성요소가 서로 종속되면 안 된다.
그래서 MVVM 패턴을 사용하게 되는데, MVVM는 View - ViewModel - Model 의 구조로 각각의 역할을 분리하여 재사용성을 높이고 의존도를 줄이는 패턴이다. View는 데이터가 보여지는 부분, ViewModel은 View에 보여지는 데이터를 관리하는 부분, Model은 데이터를 가져오는 로직으로 볼 수 있다. 안드로이드에서는 MVVM 패턴을 구현하기 위하여 AAC 를 제공한다.
※ AAC (Android Architecture Components)란?
Jetpack의 섹션 중 하나로 강력하고 테스트와 유지관리가 쉬운 앱을 디자인하도록 돕는 라이브러리
Lifecycle : 앱의 수명주기를 관리
Livedata : 기본 데이터베이스가 변경되면 뷰에 알리는 데이터 객체 빌드
ViewModel : 앱 회전 시 제거되지 않는 UI 관련 데이터 저장
Room : SQLite 개체 매핑 라이브러리
DataBinding : 프로그래매틱 방식이 아닌 선언적 형식으로 UI 구성요소를 앱의 데이터 소스와 매핑
Navigation : 프래그먼트의 진행을 보기 쉽게 정리해줌
Paging : 페이징 기법을 쉽게 적용
WorkManager : 지연 가능한 비동기 작업을 쉽게 에약할 수 있는 API
위는 구글에서 권장하는 아키텍쳐이다.각 구성요소가 한 수준 아래의 구성요소에만 종속됨을 볼 수 있다.