AAC (Android Architecture Componets)

2017년 Google I/O에서 새로운 라이브러리인 AAC (Android Architecture Components)를 발표하였습니다. ACC는 안드로이드 앱을 개발하면서 자주 만나게되는 문제들을 쉽게 해결할수 있게 지원해주는 라이브러리라고 설명하였다.

AAC는 총 5개의 라이브러리로 구성되어있습니다.

  1. Lifecycles
  2. LiveData
  3. ViewModel
  4. Room
  5. Paging

💡 Lifecycles


lifecycles는 생명주기를 모니터링 하는데 도움을 주는 라이브러리입니다. lifecycle은 Event, State, LifecycleObserver로 구성되어있다. lifecycle은 onCreate나 onResume 같은 메서드에 많은 코드가 저장되어 유지관리 하기 어렵기때문에 이것을 편리하게 사용할수 있게 만들준다.

📌 Event

Activity나 fragment에서 발생하는 생명주기 이벤트에 대응

  • ON_CREATE
  • ON_DESTROY
  • ON_PAUSE
  • ON_RESUME
  • ON_START
  • ON_STOP

📌 State

Activity나 fragment의 현재 상태에 대응

  • INITIALIAZED
  • CREATED
  • DESTROYED
  • STARTED
  • RESUMED

📌 Lifecycle Owner

Activity나 fragment에서 생명주기를 분리하고 lifecycle 객체에 담습니다. lifecycle 객체를 통해 다른 곳에서 해당 화면의 생명주기를 모니터링 할 수 있습니다. 자신의 생명주기를 담은 lifecycle 객체가 lifecycle owner입니다. 즉 생명주기를 관찰하는 observer 클래스이다.

💡 LiveData


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
})
  1. liveData 초기화 작업
  2. liveData는 val 변경이 안되는 변수로 선언이 되었지만 liveData는 MutableLiveData이기 때문에 value 는 변경이 가능하다. liveData의 value가 변경이 되면 모든 활성화 되어있는 해당 observer로 신호가 간다.
  3. liveData는 Activity 나 fragment안에서 항상 observed 되고있다. observer안에서 it parameter로 최근에 변경된 value를 받아올수있다.

💡 ViewModel


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은 화면을 회전 시켜도 데이터 정보를 그래도 보존하기 때문에 다시 데이터를 불러오지 않아도된다.

💡 Room


안드로이드 개발을 하면서 SQLite를 로컬디비로 많이 사용한다. 하지만 사용법이 복잡하다. 그래서 Room은 SQLite DB를 보다 쉽게 사용할 수 있게 구글에서 제공하는 공식 ORM (Object Relational mapping)이다. Room을 사용하면 실행 기기에 앱 데이터 캐시를 만들고 네트워크 연결 여부와 관계없이 보여지게 할 수 있다. Room은 Annotation 기반이다.

여기서 ORM은 database 테이블과 매핑되는 객체를 만들고 그 객체에서 database를 관리하는 프로그램이다.

적절한 Annotation으로 쉽게 데이터베이스, 테이블, DAO 등을 정의할 수 있습니다. 세부 내용도 Annotation을 이용해 약간의 Room 규약에 맞게 선언해주면, Primary key, 쿼리 파라미터, 반환 타입 등 자동으로 많은 것을 매칭해줍니다.

💡 Paging


RecyclerView에서 스크롤을 할때 컨텐츠를 특정 기준으로 범위를 나누고, 스크롤을 따라 범위 단위로 로드가 되도록 도와주는 것을 Paging이라고 한다.

Paging은 총 3가지 작업을 진행한다:

  • 데이터를 Page 단위로 가져오는 쿼리
  • 데이터를 특정 기준으로 Page 나누기
  • 중복 아이템 검사.

이 3가지 작업을 모두 구현하는것은 매우 불편하고 작업이 많이 들어간다. 이것을 쉽게 구현해주는것이 Paging Library이다. Page 라이브러리는 총 3가지로 구성되어있다.

  • DataSource: 로컬 또는 네트워크에서 데이터를 가져오는 쿼리를 담고 있다
  • PagedList: Page 속성과 DataSource를 들고 있다. Page 속성에 맞게 DataSource의 맞는 범위의 데이터를 불러온다.
  • PagedListAdapter: PageList를 UI에 부여주고 아이템 중복을 검사한다.

좋은 웹페이지 즐겨찾기