[Android] 안드로이드 아키텍쳐 컴포넌트(AAC) - LiveData, Databinding, Room, ViewModel



Android Architecture Component(AAC)

안드로이드 아키텍처 구성요소 는 테스트와 유지관리가 쉬운 앱을 디자인하도록 돕는 라이브러리 모음이다.


LiveData

개요

LiveData관찰이 가능한(Observable) 데이터 홀더 클래스 이다. Activity, Fragment, Service와 같은 컴포넌트의 LifeCycle을 인식하며 LifeCycle 인식을 통해 활성 상태에 있는 컴포넌트의 Observer만 업데이트한다.

Observer는 LiveData의 관찰자 이다. Observer의 Lifecycle이 STARTED 또는 RESUMED 상태이면 LiveData는 Observer를 활성 상태로 간주하여 업데이트 정보를 알린다.

장점

1. UI와 데이터 상태의 일치 보장
LiveData는 수명 주기 상태가 변경될 때 Observer에 알리므로 변경이 발생할 때 마다 Observer가 직접 UI를 업데이트할 수 있다.

2. 메모리 누출 없음
ObserverLiveData에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제된다.

3. 중지된 활동으로 인한 비정상 종료 없음
Observer의 수명 주기가 비활성 상태이면 어떤 이벤트도 수신하지 않는다.

4. 최신 데이터 유지
수명 주기가 비활성화된 경우 다시 활성화될 때 최신 데이터를 수신하며 항상 최신 데이터를 유지한다.

5. 싱글톤 패턴
LiveData는 싱글톤 패턴을 사용한다. 객체가 서비스에 한 번 연결되면 모든 Observer가 LiveData 객체를 볼 수 있다.


Databinding

개요

Databinding은 선언형으로 레이아웃의 UI 구성요소를 앱의 데이터와 결합할 수 있도록 지원하는 라이브러리이다. 데이터를 xml 파일에서 처리할 수 있으므로 편리하다.

Databinding 미사용 시

TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());

Databinding 사용 시

<TextView
	android:text="@{viewmodel.userName}" />    

장점

1. 코드가 단순해짐
UI 호출 작업을 삭제할 수 있어 파일이 단순화되고 유지관리도 쉬워진다.

2. 메모리 누수 방지
앱 성능이 향상되고 메모리 누수와 NullPointerException을 방지할 수 있다.


Room

개요

Room은 안드로이드의 내부 데이터베이스인 SQLite를 쉽고 편리하게 사용할 수 있도록 지원한다. 관련 데이터를 캐싱하여 사용자가 오프라인 상태일 때에도 데이터에 접근할 수 있다. 이후 다시 온라인 상태가 되면 변경사항을 자동으로 동기화한다.

구성요소

Database
데이터베이스 홀더를 포함하고 데이터에 연결하기 위한 역할을 한다.

Entity
데이터베이스 내의 테이블이다.

DAO(Data Access Object)
데이터베이스에 접근할 때 사용되는 메소드를 포함한다.



애플리케이션은 Room 데이터베이스를 사용해 DAO를 가져온다. 이후 각 DAO를 사용해 데이터베이스에서 Entity를 가져오고 변경사항을 다시 데이터베이스에 저장한다.


ViewModel

개요

ViewModel은 LifeCycle을 고려하여 UI 관련 데이터를 저장하고 관리할 수 있도록 설계되었다. UI를 관리하는 UI Controller에 과도한 역할을 부여하면 과부하가 올 수 있고 테스트 또한 어려워진다. 따라서 UI 관리 시 View Data 소유권을 분리하는 방법이 더 쉽고 효율적이라는 점을 이용한 것이 ViewModel이다.

활동 상태 변경에 따라 ViewModel의 수명 주기를 설명합니다.

ViewModelProviderViewModel에 LifeCycle을 전달하며 ViewModel은 LifeCycle이 끝날 때 까지 메모리에 남아있다.



:bookmark: REFERENCE
Android 아키텍처 구성요소