불필요한 코드의 중복을 방지하고, 코드를 효율적으로 재활용하기 위해 많은 디자인 패턴들이 사용됩니다. 그 중 많이 사용되고 있는 디자인 패턴들에 대해 찾아 봤습니다.
MVC 패턴은 사용자에게 보여지는 UI를 담당하는 View
, input 을 받아 처리하는 Controller
, data를 담고 있는 Model
로 이루어져 있습니다. controller
에서 event를 받으면, Model
에서 data 를 가져와 처리한 후 View
에 결과를 뿌려줍니다.
데이터의 입력과 처리를 모두 Controller
가 담당하여 Controller
가 무거워 졌습니다. 이를 개선한 것이 MVP 패턴입니다.
MVP 패턴은 사용자에게 보여지는 UI와 입력을 담당하는 View
, 데이터를 처리하는 Presenter
, data를 담고 있는 Model
로 이루어져 있습니다.
View
에서 이벤트를 받으면 그 사실을 Presenter
에게 전달합니다. Presenter
가 처리한 후 다시 결과를 View
에게 전달합니다. Presenter
는 데이터의 처리만을 담당하게 되었습니다.
각 View에 대한 입력을 처리하기 위해 View 와 Presenter는 1대 1의 관계가 요구됩니다. 비슷한 동작을 하는 View 일지라도, Presenter 를 재활용할 수 없습니다. 이를 개선한 것이 MVVM 패턴입니다.
MVVM 패턴은 UI를 담당하는 View
, 데이터를 담고 있는 Model
, 비지니스 로직이 구현되어 있는 ViewModel
로 이루어져 있습니다.
MVVM 패턴의 기본은 View 와 ViewModel 을 직접 연결하지 않는 것입니다. 그렇다면 둘은 어떻게 변화를 파악할 수 있을까요? Data Binding 을 사용하면 해결할 수 있습니다.
View 는 ViewModel 을 선택해 Data Binding 합니다. View 는 ViewModel 을 직접 참조하지 않고, 관찰(Observe) 하다가 변화가 생기면 View를 갱신합니다. ViewModel 은 View가 Data Binding 할 수 있는 속성과 명령들로 이루어져 있습니다.
View와 ViewModel, View 와 Model 사이의 의존성이 없으므로 테스트가 용이 합니다.
AAC 의 ViewModel 은 액티비티, 프래그먼트의 lifecycle 과 독립된 환경 변화에도 유지되는 lifecycle 을 가지는 클래스를 의미하고, MVVM 의 ViewModel 은 View 와 Model 사이에서 바인딩하고, 로직을 처리하는 클래스를 의미합니다.
MVVM 의 ViewModel 에서 AAC 의 ViewModel 을 사용할 수도 있고, 사용하지 않아도 MVVM 의 ViewModel은 구현 가능합니다.
https://www.youtube.com/watch?v=bjVAVm3t5cQ
https://github.com/KRMKGOLD/Android-MVVMSample
https://velog.io/@jojo_devstory/안드로이드-아키텍처-패턴-MVVM이-뭘까