본문 바로가기

Android/Basic

[Android: Jetpack] 안드로이드 AAC(Android Architecture Components) 간략한 정리

 

 

어차피 글을 쓰는 현재가 이것들을 중점적으로 공부하는 시점이기 때문에, 한번 간략하게 정리해 놓고 세부적인 내용을 개별적으로 문서화 하려고 한다.

 

AAC란?


AAC(Aandroid Architecture Pattern)란 2017년 구글I/O에서 발표한 개발자의 편의를 돕기위한 6개의 라이브러리로 구성은 다음과 같다.

  • Lifecycles(Easy handling lifecycles)
  • LiveData(Lifecycle aware observable)
  • ViewModel(Managing data in a lifecycle)
  • Room(Object Mapping for SQLite)
  • Paging(Gradually loading infomation)
  • DataBinding
  • Navigation
  • WorkManager

 

이제 각각의 라이브러리가 어떤 것인지 간략한 개념을 살펴보겠다(진짜 간략함)

1. Lifecycles


Lifecycle은 라이브러리 이름에 걸맞게 Activity나 Fragment의 생명주기 모니터링을 도우며, 다른 object가 이 상태를 observing할 수 있도록 해주는 추상 클래스(abstract class)이다.

클래스 Event와 State, 이 두가지 메인 Enumerations를 사용해 수명주기 상태를 추적한다.

  • Lifecycle: Lifecycle을 나타내는 객체
  • Lifecycle Owner: Life 객체에서 Activity, Fragment의 상태를 제공한다.
  • Lifecycle Observer: 상태 변화에 대한 이벤트를 받느

Lifecycle Owner

Lifecycle Owner는 단일 메서드 인터페이스로, 클래스에 Lifecycle이 있음을 명시한다. → 왜냐하면 인터페이스의 유일한 메서드가 getLifecycle()로, Owner(Activity or Fragment)의 Lifecycle을 반환하는 추상메서드 이기 때문이다.

Lifecycle 객체를 통해 다른 곳에서 해당 화면의 생명주기를 모니터링 할 수 있는데, 자신의 생명주기를 담은 Lifecycle객체가 LifecycleOwner이다.

 

Lifecycle Observer

생명주기를 Wrapping한 Lifecycle Owner 객체를 통해 화면 밖에서도 모니터링이 가능하지만, 생명주기에 따른 동작은 여전히 화면에서만 정의할 수 있다. 화면 밖에서도 생명주기에 따른 동작을 정회하기 위해서는 원하는 클래스에 Lifecycle Observer인터페이스를 구현하고, 넘겨받은 Lifecycle Owner객체 구현한 Lifecycle Observer를 등록해야 한다.

Lifecycle Observer를 구현한 클래스는 onResume()등의 생명주기 메소드를 정의할 수가 있다. 이 메소드들은 등록한 Lifecycle Owner가 해당 생명주기 상태가 되면 자동으로 수행되면서, 객체가 화면과 동일한 생명주기를 가진 것처럼 행동한다.

 

2. LiveData


LiveData는 Observable(식별 가능한) 형태로 사용하며, 안드로이드 Lifecycle에 따라 데이터를 관리한다.

Activity, Fragment의 Lifecycle을 따르기(Lifecycle-aware)에 활동에 대한 처리를 알아서 관리해준다.

Android Developmet 공식문서에서는 다음과 같은 장점을 확인 가능하다.

  • LiveData는 observable 패턴을 따르기 때문에, 기본 데이터가 변경될 때 Observer 객체에 알린다. 코드를 통합하여 이러한 Observer객체가 UI를 최신화하며 UI와 데이터 상태의 일치를 보장한다.
  • 메모리 누수 없는 사용을 보장한다.
  • Lifecycle에 따라 LiveData의 이벤트를 제어한다.
  • 수명 주기를 자동으로 관리한다.
  • 최신 데이터를 유지한다.
  • 기기 회전(Rotation)이 일어나도 최신데이터를 처리할 수 있도록 도와준다.(AAC-ViewModel과 함께 사용할 경우)
  • 리소스 공유를 통해 LiveData의 확장을 지원한다.

 

3. ViewModel


수명주기를 고려하여 UI관련 데이터를 저장하고 관리하도록 설계되었다.

ViewModel은 필요한 데이터를 획득하고 유지하는 것을 목표로 하기 때문에, 화면전환과 같이 뷰가 파괴된 이후 재구성되는 경우에도 데이터를 보존할 수 있다.

일반적으로 LiveData또는 DataBinding을 통해서 Activity나 Fragment가 감지할 정보를 노출한다.

  • AAC-ViewModel이 데이터 보존이 가능한 이유로는, ViewModel이 Activity의 경우 LifecycleEventObserver()로, Fragment에서는 FragmentStateManager()로 View의 Lifecycle을 관찰하다가 View가 종료되었을 때 Clear()하기 때문에, 종료가 되기 전까지 데이터가 보존되는 것이다.

 

4. Room


Google에서 제공하는 ORM(Object-realtional mapping)로, SQLite 개체 매핑 라이브러리이다.

Room을 사용하여 상용구 코드(boilerplate code)를 피하고 SQLite테이블 데이터를 Java나 Kotlin 객체로 쉽게 매핑할 수 있다.

Room은 SQLite 문의 컴파일 시간 확인을 제공하며 RxJava, Flowable, LiveData, Observable을 반환할 수 있다.

Room의 구성요소

  • 데이터베이스: 데이터베이스는 앱에 저장되어 있는 로컬 데이터에 대한 액세스 포인트를 제공해주는 역할
  • DAO(Data Access Object): DAO는 앱에서 데이터베이스의 데이터를 추가, 삭제, 업데이트 작업을 할 수 있는 메소드를 제공해주는 역할, 그 외에도 다양한 쿼리 사용이 가능
  • Enitity: 데이터베이스 내에 존재하는 데이블을 가리킨다.

 

5.Paging


페이징은 데이터베이스의 데이터를 일정한 덩어리로 나누어 제공하는 것이다.

페이징 라이브러리를 사용하면 로컬 저장소에서 네트워크를 통해 대규모 데이터세트의 데이터 페이지를 로드하고 표시할 수 있다. 이 방식을 사용하면 앱에서 네트워크 대역폭과 시스템 리소스를 모두 더 효율적으로 사용할 수 있다.

 

6. Databinding


선언형 형식으로 데이터 소스를 UI에 Binding하기 쉽게 해주며, findViewById에 의한 객체 획득 번거로움을 제거해주는 라이브러리이다.

 

7. Navigation


사용자가 앱 내의 여러 콘텐츠를 Naviagtion(탐색)하고 그곳에 들어갔다 나올 수 있게 하는 삭호작용을 의미한다.

또한, View의 흐름을 직관적으로 보여주기 때문에 앱의 동작흐름을 파악하는데도 도움이 된다.

 

8. WorkManager


WorkManager는 지속적인 작업에 권장되는 솔루션이다. 앱이 다시 시작하거나 시스템이 재부팅될 때 작업이 예약된 채로 남아있으면 그 작업은 유지된다. 대부분의 백그라운드 처리는 지속적인 작업을 통해 가장 잘 처리되므로 WorkManager는 백그라운드 처리에 권장하는 기본 API이다.


Uploaded by

N2T