디자인 패턴
디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 해결할 수 있도록 하나의 ‘규약’ 형태로 만들어 놓은 것
중복 코드 방지, 의존성 제거, 유지 보수 개선 등 코드의 더 좋은 구조를 만드는 것을 도와주는 코드 작성방법입니다.
MVVM 패턴
MVVM 패턴(Model-View-ViewModel)이란 모델(Model), 뷰(View), 뷰모델(ViewModel)로 이루어진 디자인 패턴입니다.
Model
애플리케이션의 데이터, 비즈니스 로직입니다. 내부저장소의 데이터일 수도 있고 API를 통해 데이터를 받아오는 로직일 수도 있죠.
View
MVC패턴, MVP패턴과 마찬가지로 눈으로 보이는 영역입니다.
ViewModel
view에서 요청 받은 데이터를 model에게 받아 view에게 전달해주는 부분입니다.
정리
MVVM패턴에서는 사용자 액션이 View로 들어오면, View는 ViewModel의 메서드를 호출합니다. ViewModel은 Model로부터 데이터를 받아와 갱신하며, View는 ViewModel의 데이터를 관찰하고 있다가 데이터가 갱신되는 즉시 자신의 내용을 업데이트합니다.
장점
- MVP패턴은 Presenter - View의 의존성이 있는 반면, MVVM 패턴은 ViewModel - View의 의존성이 없습니다.
- 마찬가지로 Model - View의 의존성도 없습니다.
단점
- 프로젝트가 커질수록 ViewModel이 비대해집니다.
- 설계가 쉽지 않습니다.
AAC ViewModel
- MVVM ViewModel == AAC ViewModel ???
- MVVM에서의 ViewModel과 안드로이드에서 사용하는 ViewModel은 다릅니다. MVVM에서의 ViewModel은 역할을 의미하고, 안드로이드에서 사용하는 ViewModel은 객체를 의미합니다.
- 하지만 이 둘이 완전히 연관이 없는게 아니라 보통 안드로이드에서의 ViewModel로 MVVM 패턴을 구현합니다. 즉, 안드로이드의 ViewModel은 MVVM패턴을 구현하는데에 도움이되는 객체입니다.
- AAC ViewModel 생명주기
- AAC ViewModel은 독립적인 LifeCycle을 가지고 있습니다.
- Activity가 완전히 종료되었을 때 ViewModel도 종료되며 Activity보다 조금 더 긴 LifeCycle을 가지고 있습니다.
- 때문에 ViewModel에서 Activity를 참조하면 안되며 그럴 경우 Activity가 종료되어도 ViewModel에는 데이터가 남아있어 메모리 릭이 발생할 수 있습니다.
- ViewModel은 Activity의 onDestroy()가 호출되면 onCleared() 호출되어 종료됩니다.
- 그러나 화면을 회전했을 때에도 onDestroy()가 호출되는데 이 경우에도 ViewModel이 종료되면 가지고 있던 데이터가 초기화되어 UI가 보여주던 데이터도 초기화가 되는 문제가 발생합니다.
- 하지만 이런 경우를 방지하기 위해 isChangingConfigurations() 메소드로 재생성을 위한 onDestroy()인지 판단하여 true일 경우 onCleared()가 호출되지 않습니다.
- AAC ViewModel은 독립적인 LifeCycle을 가지고 있습니다.
※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.