Android Architecture Component
테스트와 유지보수가 쉬운 앱을 디자인할 수 있도록 돕는 라이브러리의 모음
ViewModel
앱의 Lifecycle을 고려하여 UI 관련 데이터를 저장하고 관리하는 컴포넌트
UI Controller로부터 UI 관련 데이터 저장 및 관리를 분리하여 ViewModel이 담당하도록 하면 다음과 같은 문제를 해결할 수 있다.
- 안드로이드 프레임워크는 특정 작업이나 완전히 통제할 수 없는 기기 이벤트에 대한 응답으로 UI Controller를 제거하거나 다시 만들 수 있는데, 이런 경우 UI Controller에 저장된 모든 일시적인 UI 관련 데이터가 삭제됩니다. 단순한 데이터의 경우 onSaveInstanceState() 메서드를 사용하여 복구할 수 있지만 대용량의 데이터의 경우엔 불가능
- UI Controller에서 데이터를 위한 비동기 호출을 한다면 메모리 누수 가능성을 방지하기 위한 많은 유지 관리가 필요, 위에서와 같이 데이터를 복귀해야 하는 경우 비동기 호출을 다시 해야 해서 리소스가 낭비
- UI Controller에서 DB나 네트워크로부터 데이터를 로드하도록 하면 다른 클래스로 작업이 위임되지 않고 단일 클래스가 혼자서 앱의 모든 작업을 처리하려고 할 수 있다. 이 경우 테스트가 훨씬 더 어려워짐
LiveData
LiveData는 식별 가능한 데이터 홀더 클래스로 다른 앱 컴포넌트의 Lifecycle을 인식하며,
이를 통해 활성 상태에 있는 앱 컴포넌트 옵저버에게만 업데이트 정보를 알림
LiveData 사용시 다음과 같은 이점
- UI와 데이터 상태의 일치 보장: LiveData는 Observer Pattern을 따르며 Lifecycle 상태가 변경될 때마다 Observer 객체에 알림. 또 앱 데이터의 변경이 발생할 때마다 관찰자에게 알려 UI를 업데이트할 수 있도록 한다.
- 메모리 누수 없음 : Observer는 Lifecycle 객체에 결합되어 있으며 연결된 객체의 Lifecycle이 끝나면 자동으로 삭제.
- 중지된 활동으로 인한 비정상 종료 없음 : 활동이 백 스택에 있을 때를 비롯하여 Observer가 비활성 상태에 있으면 어떤 LiveData 이벤트도 받지 않음.
- Lifecycle을 더 이상 수동으로 처리하지 않음 : UI 컴포넌트는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않으며, LiveData가 이를 자동으로 관리
- 최신 데이터 유지 : 컴포넌트가 비활성화되면 다시 활성화될 때 최신 데이터를 수신.
- 적절한 구성 변경 : 기기 회전과 같은 구성 변경으로 인해 액티비티나 프래그먼트가 다시 생성되면 최신 데이터를 즉시 받게 됨
- 리소스 공유 : 앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑 할 수 있음.
Room
SQLite에 추상화 레이어를 제공하여 원활한 DB 액세스를 지원하고 SQLite를 완벽히 활용할 수 있게 하는 라이브러리
Room을 사용하면 앱을 실행하는 기기에서 앱 데이터의 캐시를 만들 수 있으며, 이 캐시를 통해 사용자는 인터넷 연결 여부와 관계없이 앱에 있는 주요 정보를 일관된 형태로 볼 수 있다.
Room 사용법
AAC 실습
AAC
https://wooooooak.github.io/android/2019/06/11/Android_liveData_value/
https://velog.io/@hwi_chance/Android-안드로이드-AAC
'Android > Reference' 카테고리의 다른 글
LiveData setValue(), postValue() 차이 (0) | 2022.02.16 |
---|---|
AAC (MVVM + RoomDB + RecyclerView) 실습 (0) | 2022.02.09 |
string.xml 에 %d, %s 사용 / Databinding 에 StringFormat 적용 (0) | 2022.01.20 |
WorkManager / 워크매니저 (0) | 2022.01.04 |
View invalidate(), requestLayout() 의 차이 (0) | 2021.12.22 |