SW 공부노트
[안드로이드] Android Jetpack / AAC와 MVVM 본문
안드로이드 개발을 하다보면 Android Jetpack과 AAC를 많이 들어봤을 것이다.
자주 사용하던 라이브러리들이 Jetpack과 AAC라며 소개가 되어 있었는데,
둘의 차이는 무엇인지 어떤 종류들이 있는지 궁금해져 정리해보았다.
또한, MVVM을 AAC를 통해 어떻게 구현하는 지 알아보았다.
Android Jetpack
Android Jetpack이란 구글에서 제공하는 안드로이드 컴포넌트 라이브러리 모음으로 좀 더 효율적이고 질 좋은 개발을 하는데 큰 도움이 된다.
Android Jetpack은 크게 4가지로 나뉜다.
- Architecture
- UI
- Foundation
- Behavior
AAC
AAC(Android Architecture Componenet)는 Jetpack에서 Architecture에 해당하는 부분으로 테스트와 유지보수가 쉬운 안드로이드 앱을 디자인할 수 있도록 돕는 라이브러리 모음이다. 즉, 효율적인 아키텍처로 앱을 디자인하는 데 도움을 주며 앱 아키텍처를 안내하는 역할을 한다.
안드로이드는 Activity, Fragment, BroadcastReceiver, Service 등 여러 컴포넌트들이 있고, 생명주기가 다르게 얽혀있어 이러한 컴포넌트들을 부드럽게 연결하고 생명주기가 엉키지 않게 설계해야 한다.
이러한 컴포넌트들에 대한 가이드를 제공하는 것이 바로 AAC이다!
MVVM
AAC를 활용하면 현재 구글에서 권장하는 MVVM 구조로 앱 설계가 가능하다.
MVVM은 디자인 패턴 중 하나로 Model, View, ViewModel을 사용해 앱을 설계하는 패턴을 말한다.
- Model: 데이터
- 데이터모델이라고도 하며, 다양한 데이터소스로부터 필요한 데이터를 준비함
- View: UI(레이아웃)
- 기본적으로 데이터를 보여주는 역할(Presenter)로, 비즈니스 로직을 포함하지 않는다.
- ViewModel을 관찰하고 있다가 데이터가 변경되며 화면을 업데이트한다.
- ViewModel: View와 Model을 이어주는 역할
- View와 관련된 비즈니스 로직이 포함되며, View를 위한 데이터를 처리하는 부분이다.
- View와 ViewModel은 1:n의 관계를 가진다.
- DataBinding을 통해 View가 변경된 데이터 감지 및 UI 업데이트
쉽게 정리하면,
View로부터 사용자 입력받음 -> ViewModel에서 입력에 따른 데이터 처리 -> 데이터 처리로 인해 Model 변경
-> 변경된 데이터가 담긴 ViewModel을 관찰하는 View는 자동으로 UI 업데이트
장점
- View가 데이터를 실시간으로 관찰해 자동으로 UI 갱신
- 직접 View를 바꾸는 번거로움이 없고, 데이터 불일치 문제가 발생할 확률이 적다.
- 생명주기로부터 안전하며, 메모리 누수 방지
- ViewModel은 Activity, Fragment의 생명주기를 따르지 않아 UI가 재구성되어도 데이터를 유지하고 있어 영향 없음
- View가 활성화되어 있을 경우에만 작동하기 때문에 불필요한 메모리 사용을 줄일 수 있다.
- 역할을 분리함으로써 모듈화
- UI, 비즈니스 로직, DB가 기능별로 모듈화할 수 있다.
- 단위 테스트가 용이해진다.
단점
- 기존에 비해 추가로 만들어야 하는 클래스가 많고, 이를 연결해줘야 하기 때문에 복잡함
다음은 앱 아키텍처 가이드의 권장 구조 이미지이다.
구조는 아래와 같이 나눌 수 있으며, AAC에서 제공하는 라이브러리들을 표시해두었다.
- Activity / Fragment
View에 해당하는 부분으로, UI와 관련된 프레젠테이션 로직을 작성한다.
- ViewModel
ViewModel에 해당하는 부분으로, View가 요청한 데이터를 Model에 요청해 받아오는 역할로 이와 관련된 비즈니스 로직을 사용한다. 또한 View와 Model의 의존성을 낮춰 모듈을 분리한다.
하나의 View에 하나의 ViewModel을 사용하는 것이 일반적이다.
MVVM의 ViewModel을 AAC의 ViewModel을 통해 구현한다.
ViewModel에 들어있는 LiveData는 ViewModel에서 View에게 일관성있는 데이터를 제공하기 위해 사용한다.
UI에서 해당 데이터를 관찰(observe)해 변화를 감지하고 특정 동작을 수행한다.
또한, Data Binding을 통해 레이아웃 파일에서 ViewModel의 LiveData를 바인딩해 관찰하고 변화된 데이터를 자동으로 UI에 반영해 개발자에게 편리함을 준다.
- Repository
ViewModel에서 요청한 데이터를 Repository에서 내부 데이터베이스(Room)나 외부 통신을 통해 불러오고, 불러온 데이터를 저장 및 가공해 ViewModel에게 전달한다.
위의 앱 아키텍처 이미지를 보고 전체적인 안드로이드 앱 설계에 대한 틀이 잡히긴 했지만, 실제로 이를 어떻게 코드에 적용해야 할지는 감이 잡히지 않는다. 앱 아키텍처에 대해 다시 공부해서 앱 설계를 어떻게 진행해야 할 지 정리하고, AAC 라이브러리들을 통해 MVVM 패턴을 적용한 프로젝트를 진행할 예정이다. 위 앱 아키텍처 이미지에서 특히 repository의 역할이 뭔지 명확히 이해가 가지 않아 여러 예제와 문서들을 통해 학습할 계획이다!
'안드로이드 > 아키텍처 & 라이브러리' 카테고리의 다른 글
[안드로이드] Flow (0) | 2023.05.15 |
---|---|
[안드로이드] Android 앱에 Hilt 사용 (0) | 2023.04.02 |
[안드로이드] 의존성 주입(DI) (0) | 2023.04.01 |
[안드로이드] 앱 아키텍처 가이드 (0) | 2023.03.31 |
[안드로이드/아키텍처] MVC, MVP, MVVM (0) | 2023.03.29 |