2017년 Google I/O에서 새로운 라이브러리인 AAC (Android Architecture Components)를 발표하였습니다. ACC는 안드로이드 앱을 개발하면서 자주 만나게되는 문제들을 쉽게 해결할수 있게 지원해주는 라이브러리라고 설명하였다.
AAC는 총 5개의 라이브러리로 구성되어있습니다.
lifecycles는 생명주기를 모니터링 하는데 도움을 주는 라이브러리입니다. lifecycle은 Event, State, LifecycleObserver로 구성되어있다. lifecycle은 onCreate나 onResume 같은 메서드에 많은 코드가 저장되어 유지관리 하기 어렵기때문에 이것을 편리하게 사용할수 있게 만들준다.
Activity나 fragment에서 발생하는 생명주기 이벤트에 대응
Activity나 fragment의 현재 상태에 대응
Activity나 fragment에서 생명주기를 분리하고 lifecycle 객체에 담습니다. lifecycle 객체를 통해 다른 곳에서 해당 화면의 생명주기를 모니터링 할 수 있습니다. 자신의 생명주기를 담은 lifecycle 객체가 lifecycle owner입니다. 즉 생명주기를 관찰하는 observer 클래스이다.
LiveData는 Data의 변경을 관찰 할 수 있는 Data Holder 클래스 입니다.
일반적인 Observable과는 다르게 LiveData는 안드로이드 생명주기(LifeCycle)를 알고 있습니다. (Lifecycle-Aware)
즉, 액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(Lifecycle)를 인식하며 그에따라
LiveData는 활성상태(active)일때만 데이터를 업데이트(Update) 합니다.
활성상태란 STARTED 또는 RESUMED 를 의미합니다.
또한 LiveData 객체는 Observer 객체와 함께 사용됩니다. LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행되게 됩니다.
LiveData is an observable data holder.
This allows the components in your app to be able to observe LiveData objects for changes without creating explicit and rigid dependency paths between them.
//1
val liveData: MutableLiveData<Any>()
//2
liveData.value = "Hello"
//3
liveData.observe(this, Observer {
//UI update
})
AAC에서 제공하는 ViewModel 추상클래스는 우리가 흔히 알고있는 MVVM에서의 ViewModel과는 전혀 상관이 없다. 현재 안드로이드 개발을 하면서 MVVM은 대세가 되었고 MVVM에서 ViewModel은 View와 Model사이에서 데이터를 관리하고 바인딩 해주는 역할을 하고있다. 하지만 AAC의 ViewModel 전혀 다른 기능을 갖고있다. 그렇기 때문에 항상 혼돈되지 않도록 주의해야한다.
안드로이드 공식 문서에사는 ACC에서 제공하는 ViewModel을 다음과 같이 정의한다.
The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations.
간단히 정리하면 화면 회전같이 환경 변화에서도 view에 적용되는 UI를 유지하기 위해 lifecycle을 알고 있는 클래스라고 한다. 즉 View와 Model사이에서 데이터를 관리하고 바인딩 해주는 MVVM의 ViewModel과는 전혀 다른 클래스이다.
주로 앱을 사용하면서 화면을 회전하면 Activity나 fragment는 종료가되고 다시 생성이 된다. 즉 view에 사용됬던 데이터들도 다시 불러와야하는 상황이 오는것이다. 그러나 AAC의 ViewModel은 화면을 회전 시켜도 데이터 정보를 그래도 보존하기 때문에 다시 데이터를 불러오지 않아도된다.
안드로이드 개발을 하면서 SQLite를 로컬디비로 많이 사용한다. 하지만 사용법이 복잡하다. 그래서 Room은 SQLite DB를 보다 쉽게 사용할 수 있게 구글에서 제공하는 공식 ORM (Object Relational mapping)이다. Room을 사용하면 실행 기기에 앱 데이터 캐시를 만들고 네트워크 연결 여부와 관계없이 보여지게 할 수 있다. Room은 Annotation 기반이다.
여기서 ORM은 database 테이블과 매핑되는 객체를 만들고 그 객체에서 database를 관리하는 프로그램이다.
적절한 Annotation으로 쉽게 데이터베이스, 테이블, DAO 등을 정의할 수 있습니다. 세부 내용도 Annotation을 이용해 약간의 Room 규약에 맞게 선언해주면, Primary key, 쿼리 파라미터, 반환 타입 등 자동으로 많은 것을 매칭해줍니다.
RecyclerView에서 스크롤을 할때 컨텐츠를 특정 기준으로 범위를 나누고, 스크롤을 따라 범위 단위로 로드가 되도록 도와주는 것을 Paging이라고 한다.
Paging은 총 3가지 작업을 진행한다:
이 3가지 작업을 모두 구현하는것은 매우 불편하고 작업이 많이 들어간다. 이것을 쉽게 구현해주는것이 Paging Library이다. Page 라이브러리는 총 3가지로 구성되어있다.