이전에 다뤘던 안드로이드 아키텍처 가이드의 곳곳에 등장했던 안드로이드 아키텍처 컴포넌트(Android Architecture Component)를 사용하면 자연스럽게 MVVM 아키텍처를 사용하게 된다고 한다. 이번 포스팅에서는 MVVM 아키텍처가 어떤 것인지와 AAC가 무엇이고 어떻게 사용되는지 알아본다.
MVVM 아키텍처
- Model : MVC의 Model과 동일한 역할
- DataModel이라고도 하며, 다양한 데이터 소스로부터 필요한 데이터를 준비함
- ViewModel에서 데이터를 가져갈 수 있게 데이터를 준비하고 그에 대한 이벤트를 보냄
- View : 레이아웃을 정의함
- 기본적으로 데이터를 보여주기만 하기 때문에 비즈니스 로직을 포함하지 않지만 UI 변경과 관련된 일부 로직은 포함될 수 있음 (Android는 생명주기라는 플로우를 가지고 있기 때문에 이것을 처리하는 것만으로도 복잡해짐)
- ViewModel을 관찰하고 있다가 상태 변화가 전달되면 화면을 갱신해야 함
- ViewModel : View와 Model 사이의 매개체 역할
- View와 관련된 비즈니스 로직이 들어가며 데이터를 가공해서 View에 뿌리기 쉬운 Model로 바꾸는 역할
- MVP와 달리 View와 ViewModel이 1:n의 관계를 가질 수 있음(Presenter와 달리 View에 대한 참조가 없음)
- View가 데이터 바인딩(Data Binding) 할 수 있는 속성과 명령으로 구성되어 있음
다시 정리해 보자면👆
사용자 입력은 View로 전달되며, View는 ViewModel이 제공하는 데이터를 관찰하여 UI를 업데이트 한다.
→ View는 자신이 이용할 ViewModel을 선택하여 데이터를 바인딩(binding)하여 업데이트 받게 되는 것
Model의 상태나 데이터가 변경되면 해당하는 ViewModel을 이용하는 View가 자동으로 업데이트 된다.
→ ViewModel은 View를 나타내기 위한 Model이며, View의 Presentation Logic을 처리하는 것
[ 장점 ]
- View가 데이터를 실시간으로 관찰할 수 있음
- LiveData(Observable 패턴)을 사용하기 때문에 데이터베이스를 관찰하고 자동으로 UI를 갱신함
- 직접 View를 바꾸는 번거로움이 없고 데이터와 불일치할 확률이 줄어듦
- 생명주기로부터 안전하며 메모리 누수를 방지함
- ViewModel을 통해 데이터를 참조하기 때문에 Activity나 Fragment의 생명주기를 따르지 않음
- 화면 전환과 같이 Activity가 내려갔다가 다시 재구성되어도 ViewModel이 데이터를 유지하고 있기 때문에 영향받지 않음
- View가 활성화되어 있을 경우에만 작동하기 때문에 불필요한 메모리 사용을 줄일 수 있음
- 역할을 분리함으로써 모듈화함
- UI, 비즈니스 로직, DB가 기능별로 모듈화됨
- 유닛테스트가 용이해짐
[ 단점 ]
기존에 비해 추가로 만들어주어야 하는 클래스가 많고, 이 클래스들을 코딩으로 연결해주어야 함
단순 UI 작업에서는 MVVM을 구현하는 부담이 지나치게 과해질 수 있음
아주 큰 응용 프로그램에서 데이터 바인딩을 사용한다면 눈에 띄게 메모리를 소모하게 됨
Android Architecture Component; AAC
AAC는 테스트와 유지보수가 쉬운 앱을 디자인할 수 있도록 돕는 라이브러리
안드로이드는 Activity, BroadcastReceiver, Service 등 여러 컴포넌트들이 있고, 생명주기가 다르게 얽혀있다. 앱을 잘 만들기 위해서 이러한 컴포넌트들을 부드럽게 연결해야 하는데, 생명주기를 학습하고 엉키지 않게 고민하는 것은 개발자의 몫! 😭😭
구글이 SDK에서 제공하는 컴포넌트들에 대해 개발자들에게 더 가이드를 주기를 원했고, 결과적으로 AAC를 만들게 된 것이다!
이전 포스팅에서 다뤘던 안드로이드 아키텍처 가이드에서도 말하듯이 보일러 플레이트한 코드로 시간낭비하지 말고 AAC를 사용하라!
- Lifecycles (Easy handling lifecycles) ✅
- LiveData (Lifecycle aware observable) ✅
- ViewModel (Managing data in lifecycle) ✅
- Room (Object Mapping for SQLite) ✅
- Paging (Gradually loading information)
MVVM 아키텍처에 대해 알아보면서 이전 안드로이드 아키텍처 가이드에서 다뤘던 내용을 좀 더 이해할 수 있게 되었다. 그래도 아직은 이론만 다뤘기 때문에 실제로 어떻게 적용해야 할지 잘 모르겠다. 계속해서 AAC 라이브러리 하나하나 자세히 공부하면서 MVVM을 실습할 수 있는 작은 토이 프로젝트를 진행할 계획이다.
reference >
- https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EB%B7%B0%EB%AA%A8%EB%8D%B8
- https://kotlinworld.com/m/42
- https://blog.yena.io/studynote/2019/03/16/Android-MVVM-AAC-1.html
- https://velog.io/@jojo_devstory/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%ED%8C%A8%ED%84%B4-MVVM%EC%9D%B4-%EB%AD%98%EA%B9%8C
- https://medium.com/@maryangmin/android-architecture-components-%EC%86%8C%EA%B0%9C-1-8e04491be1f6
'ANDROID > Android Jetpack' 카테고리의 다른 글
[Android/Jetpack] AAC - Data Binding (0) | 2021.08.11 |
---|---|
[Android/Jetpack] AAC - Room (0) | 2021.08.03 |
[Android/Jetpack] AAC - ViewModel (0) | 2021.07.27 |
[Android/Jetpack] AAC - LiveData (0) | 2021.07.21 |
[Android/Jetpack] AAC - Lifecycles (0) | 2021.07.20 |
[Android] MVC, MVP 아키텍처 (0) | 2021.07.12 |
[Android/Jetpack] 앱 아키텍처 가이드(App Architecture Guide) (0) | 2021.07.09 |
[Android/Jetpack] Jetpack이란? (0) | 2021.07.09 |
댓글