MVVM이란?
MVVM( Model View ViewModel )은 Microsoft 설계자 인 Cooper & Peters에 의해 탄생된 디자인 패턴
John Gossman에 의해 2005년 발표 되어 클라이언트 기반의 플랫폼에서 조금씩 사용되기 시작
- Model : MVC의 Model과 동일한 역할
- Network, DB, SharedPreferences 등 다양한 Data Source로부터 필요한 데이터를 준비
- ViewModel에서 데이터를 가져갈 수 있게 데이터를 준비하고 그에 대한 이벤트를 보냄
- View : 레이아웃을 정의
- 기본적으로 데이터를 보여주기만 하기 때문에 비즈니스 로직을 포함하지 않지만 UI 변경과 관련된 일부 로직은 포함될 수 있음 (Android는 생명주기라는 플로우를 가지고 있기 때문에 이것을 처리하는 것만으로도 복잡해짐)
- ViewModel을 관찰하고 있다가 상태 변화가 전달되면 화면을 갱신해야 함
- Activity, Fragment, CustomView, Dialog 등의 UI 컴포넌트
- ViewModel : View와 Model 사이의 매개체 역할
- View와 관련된 비즈니스 로직이 들어가며 데이터를 가공해서 View에 뿌리기 쉬운 Model로 바꾸는 역할
- MVP와 달리 View와 ViewModel이 1:n의 관계를 가질 수 있음(Presenter와 달리 View에 대한 참조가 없음)
- View가 데이터 바인딩(Data Binding) 할 수 있는 속성과 명령으로 구성되어 있음
- ViewModel은 View의 Context에 대한 레퍼런스를 가지면 안됨, ViewModel이 destroy() 이외의 Lifecycle에서는 메모리에서 해제되지 않기 때문 (메모리 누수 발생)
정리
사용자 입력은 View로 전달되며, View는 ViewModel이 제공하는 데이터를 관찰하여 UI를 업데이트.
→ View는 자신이 이용할 ViewModel을 선택하여 데이터를 바인딩(binding)하여 업데이트 받게 되는 것
Model의 상태나 데이터가 변경되면 해당하는 ViewModel을 이용하는 View가 자동으로 업데이트.
→ ViewModel은 View를 나타내기 위한 Model이며, View의 Presentation Logic을 처리하는 것
Android에서의 MVVM의 동작형태
- 사용자의 Action이 View를 통해 들어옴
- View에 Action이 들어오면, ViewModel에 Action을 전달
- ViewModel은 Model에게 데이터 요청
- Model은 ViewModel에게 요청받은 데이터를 응답
- ViewModel은 응답 받은 데이터를 가공하여 저장
- View는 ViewModel과 DataBinding하여 화면을 나타냄
장점
- View가 데이터를 실시간으로 관찰할 수 있음
- LiveData(Observable 패턴)을 사용하기 때문에 데이터베이스를 관찰하고 자동으로 UI를 갱신함
- 직접 View를 바꾸는 번거로움이 없고 데이터와 불일치할 확률이 줄어듦
- 생명주기로부터 안전하며 메모리 누수를 방지함
- ViewModel을 통해 데이터를 참조하기 때문에 Activity나 Fragment의 생명주기를 따르지 않음
- 화면 전환과 같이 Activity가 내려갔다가 다시 재구성되어도 ViewModel이 데이터를 유지하고 있기 때문에 영향받지 않음
- View가 활성화되어 있을 경우에만 작동하기 때문에 불필요한 메모리 사용을 줄일 수 있음
- 역할을 분리함으로써 모듈화함
- UI, 비즈니스 로직, DB가 기능별로 모듈화됨
- 유닛테스트가 용이해짐
단점
- 기존에 비해 추가로 만들어주어야 하는 클래스가 많고, 이 클래스들을 코딩으로 연결해주어야 함
- 단순 UI 작업에서는 MVVM을 구현하는 부담이 지나치게 과해질 수 있음
- 아주 큰 응용 프로그램에서 데이터 바인딩을 사용한다면 눈에 띄게 메모리를 소모하게 됨
MVVM
https://velog.io/@minnie_dev/Android-MVVM
https://junyoung-developer.tistory.com/140
'Develop' 카테고리의 다른 글
Architecture Pattern MVC, MVP, MVVM, MVI (0) | 2023.12.02 |
---|---|
ADB를 이용한 APK 추출, APK 설치, ADB 명령어 정리 (0) | 2022.01.12 |