Tech Log

[Android] Android Architecture Components(AAC) 본문

Android/Widget

[Android] Android Architecture Components(AAC)

yuhee kim 2022. 12. 21. 12:55

안드로이드 개발자 채용 공고를 보면 'AAC 적용 경험'을 요구하는 곳을 볼 수 있다. 따라서 어떤 것인지 궁금했고 최근에 프로젝트에 AAC의 ViewModel을 적용해보았다. 실제로 적용해보며, 데이터를 편하게 관리할 수 있었다. 또한 context가 필요할 때 AAC ViewModel을 사용하였다.

 

ViewModel을 써보면서 또 어떤 다른 장점이 있길래, 구글이 AAC를 따로 만들어냈는지 그 이유가 궁금했다.

이에 대해 알아보고 ViewModel 이외에 다른 AAC(Component)는 어떤 것이 있는지 정리해보려 한다.

 

 

 

 

 

1. AAC는 무엇인가?

2. AAC에는 어떤 Component가 있는가?

3. AAC의 활용

 

Android Architecture Components(AAC)는 무엇인가?

개요

Activity나 Fragment의 LifeCycle을 관리하며, 메모리 누수를 방지하는 것은 복잡할 수 있다.

유지보수가 용이하도록 애플리케이션에 권장 아키텍처를 적용하는 것 또한 어려운 것이다.

이러한 문제들을 해결하고 정교한 애플리케이션을 쉽게 만들기 위해, AAC를 활용한다.

 

정의

애플리케이션을 강력하고 테스트, 유지보수를 쉽게 할 수 있도록 디자인할 수 있게 해주는 라이브러리 모음

다시 말하자면, AAC는 생명 주기 상태 변화와 구성 변경(Configuration changes)에도 데이터의 지속성을 보장하는데 도움이 되는 라이브러리 모음이다. 또한, 프로그램 설계를 용이하게 하여 각각의 클래스들을 테스트와 유지보수가 쉽도록 해준다.

 

AAC에는 어떤 Component가 있는가?

출처 : https://android-developers.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html

Android Jetpack 에서 Architecture 부분이 AAC에 해당된다.

AAC의 Component들은 블럭이고, 이 블럭들을 쌓아 정교한 애플리케이션을 만드는 것이다.

(안드로이드 공식 블로그에서는 이 과정을 Building Blocks라고 표현해놓았다)

 

UI Layer Libraries

Lifecycle-aware Components

Lifecycle-aware Components는 Activity나 Fragment의 수명주기(Lifecycle)의 변화를 감지하고, 이에 따라 기능을 하는 Component이다.

대표적으로 LiveData가 있다. LiveData는 수명 주기를 인식하는 클래스이다.

클래스 자체가 Lifecycle-aware Component가 아니더라도,

LifecycleObserver 인터페이스를 구현하여, 클래스가 수명 주기를 인식하도록 할 수 있다.

 

이때 LifecycleObserver를 간단하게 설명하자면,

LifecycleObserver 인터페이스는 수명 주기를 관리하는데, 이때 LifecycleObserver 인터페이스가 구현된 클래스를 Observer라고 한다. 그리고 이 Observer가 관리하는 수명 주기를, 갖고 있는 Activity나 Fragment을 Owner라고 한다.

 

LiveData

LiveData는 수명 주기를 인식하는 데이터 홀더 클래스이다.

애플리케이션 구성 요소(Activity, Fragment, Service 등)의 수명 주기를 인식한다.

LiveData는 수명 주기가 비활성 단계였을 때 STARTED 이거나 RESUMED 와 같은 활성 단계로 변하면 데이터를 업데이트한다.

수명 주기가 DESTROYED 되었을 때, LiveData도 자동으로 제거된다.

이외에도 수명 주기와 관련된 기능을 하여 메모리 누수 방지와 같은 다양한 이점이 있다.

 

ViewModel

ViewModel은 UI에 필요한 데이터를 갖고 있는 클래스이다.

ViewModel도 역시 수명 주기와 관련된 기능을 수행하고 있다.

구성 변경이 일어나면, Activity나 Fragment가 소멸되고 다시 생성되는데,

이때 ViewModel을 사용하면 데이터가 사라지지 않고 유지되는 것을 확인할 수 있다.

ViewModel은 Activity, Fragment와 비슷하게 수명 주기를 갖고 있다.

 

Data Binding

Data Binding은 View Binding과 비슷하게, 데이터 소스와 UI Component를 연결해주는 라이브러리다.

View Binding과의 차이점은 여러 개 있지만, 그 중 하나는 Data Binding만 양방향 바인딩이 가능하다는 것이다.

양방향 바인딩은, 데이터에 변경 사항이 있다면 View에 반영이 되며 그 반대로도 성립이 되는 것이다.

 

MVVM 패턴을 적용할 때, Data Binding이 많이 사용된다.

ViewModel에 의존적인 View에 Data Binding을 적용하면서 커플링(Coupling)을 줄이기 위해 주로 사용된다.

*커플링(Coupling) : 소프트웨어 모듈 간의 상호 의존성의 정도 (출처 : 위키피디아)

 

Paging

Paging은 많은 데이터를 불러올 때 한 번에 다 불러오는 것이 아니라, 나누어서 불러올 수 있도록 하는 라이브러리다.

Paging 라이브러리를 사용하면, 네트워크 대역폭과 시스템 자원을 효율적으로 사용할 수 있다고 한다.

 

RecyclerView와 함께 사용하면 데이터 목록을 스크롤 하면서 데이터를 쪼개어서 불러올 수 있게 된다.

Room에서 데이터를 나누어서 불러와, View에 반영할 때 ViewModel, LiveData와도 함께 잘 사용할 수 있다.

 

Navigation

Navigation은 복잡한 화면 이동을 쉽게 해준다.

버튼을 누르고 다른 화면으로 넘어가는 것은 단순히 Intent를 많이 사용했다.

하지만 Bottom Navigation과 같이 하나의 Activity에서 여러 개의 Fragment를 관리하는 경우,

Fragment가 많아질 수록 관리가 어려워지는 경향이 있다.

이때 Navigation Component의 Navigation graph, NavHost, NavController 를 통해 쉽게 화면 이동을 관리할 수 있다.

 

Navigation graph를 사용하면 화면 이동의 로직을 시각화하여 볼 수 있다.

화면 이동 시 넘어간 데이터, 애니메이션 정보 등을 볼 수도 있다.

 

NavHost는 여러 레이아웃을 추가할 빈 화면이다.

 

NavController는 NavHost의 화면 변환 액션을 수행하는 객체이다. 

만약 아래와 같은 코드를 입력하면 NavController가 액션을 수행한다.

findNavController().navigate(R.id.win_action)

 

Data Layer Libraries

WorkManager

WorkManager는 백그라운드 처리에 사용되는 API다.

백그라운드 작업을 예약하거나, 배터리 부족 모드와 같은 제약 조건을 걸고 백그라운드 작업을 시행할 수 있도록 할 수도 있다.

 

Room

Room은 로컬 데이터베이스를, 높은 지속성을 갖고 관리할 수 있는 라이브러리다.

기기가 네트워크 접속이 안될 때도 콘텐츠를 이용할 수 있도록 한다.

 

로컬 데이터베이스인 SQLite와 다른 점이 있다면,

SQLite는 쿼리에 대한 에러를 컴파일 시간에 확인할 수 없지만 Room은 컴파일 시간에 확인할 수 있다.

SQLite는 쿼리와 데이터 객체를 변환할 때 Boilerplate 코드를 많이 작성해줘야 한다.

하지만, Room은 Boilerplate 코드 없이도 간편하게 데이터베이스 객체를 매핑시켜줄 수 있다.

또한, SQLite의 경우 스키마가 바뀌면 일일이 쿼리를 업데이트해줘야 하지만 Room은 수동으로 업데이트해줄 필요 없다. 

 

AAC의 활용

App Architecture 설계에 AAC를 활용

MVVM 패턴을 적용할 때 AAC를 활용할 수 있다.

(물론 다른 아키텍처 패턴에도 AAC를 활용할 수 있다)

 

출처 : android developers

Activity/Fragment가 View.

 

AAC ViewModel이 ViewModel이 된다.

이때 UI에 필요한 데이터는 LiveData를 사용한다. 이를 통해 수명 주기를 인식하며 데이터를 관리할 수 있도록 한다.

 

Room 라이브러리의 캐시 데이터와 Retrofit으로 받아온 데이터가 Model이 된다.

 

 

 

 

AAC를 써보기는 했지만 몇 개만 써본 것이라 다른 Component에 대해서 많이 궁금했다.

이번 포스팅을 통해 대략 정리가 된 느낌이다.

근데 AAC의 각 Component들에 대한 설명이 약간 길어진 것 같다.

그리고 각 Component들은 부가적인 설명이 필요해서, 따로 글을 다 작성해야 할 필요가 있어 보임

 

참조

'Android > Widget' 카테고리의 다른 글

[Android] RecyclerView  (0) 2022.07.21
[Android] ViewPager2  (0) 2022.06.23
Comments