MVP
(Model View Presenter)
Model | Presenter | View |
- 데이터, 비즈니스 로직 - UI에 대한 로직은 가지지 않는다. - DB나 API접근에 대한 처리는 여기에서 해준다. |
- 모델과 뷰 사이에서 통신한다. - 뷰에서 발생한 이벤트가 프레젠터에 알려지면, 프레젠터는 그 이벤트에 대응하는 처리(모델에 접근)를 한다. |
- 데이터를 표시한다. |
View와 Model간 직접 접근하는 일 없이, 그 사이에는 항상 Presenter가 들어간다.
프레젠터는 Model, View의 인스턴스를 직접 참조하지 않고, 인터페이스를 이용해 접근한다.
(이렇게 함으로서 테스트 시 Mock Object로 대체할 수 있어 테스트하기 쉽다.)
MVP의 장점
- 코드의 관리 효율이 높다.
- 액티비티를 작게 만들 수 있다.
- 뷰와 모델 간 의존관계가 없어진다.
MVP의 단점
- 인터페이스를 통해 뷰와 모델에 접근하므로, 그것들의 위치를 인터페이스로서 정의할 필요가 있는데 이 부분이 길어지기 쉽다.
- 모델에서 가져온 데이터를 뷰에 표시하는것을 개발자가 직접 구현해야 한다.
- 안드로이드에 기본적으로 MVP패턴을 지원하는 프레임워크가 없어서, 어떻게 UI 로직을 프레젠터로 분리하는가 하는 설계상의 난이도가 높다.
MVVM
(Model View ViewModel)
Android Gradle Plugin을 통해 데이터 바인딩이 지원된다.
데이터 바인딩이란, 사용자 인터페이스와 데이터를 연결하는 매커니즘이다.
cf) Databinding 참고
[Android][Java] findViewById 대체하기(2) - DataBinding
이전 게시글에서 분석한 내용을 토대로, 그리고 MVVM패턴을 사용해보려는 생각으로 DataBinding을 사용하기로 했다. 1. Gradle에서 DataBinding 활성화하기 app수준 gradle에 다음과 같이 추가합니다. android
angxxu.tistory.com
MVVM은 이러한 데이터 바인딩을 이용한 설계기법이다.
Model | ViewModel | View |
- 데이터, 비즈니스 로직 - UI에 대한 로직은 가지지 않는다. - DB나 API접근에 대한 처리는 여기에서 해준다. |
- View의 상태, UI에 대한 로직 구현 - View 클릭 등의 이벤트를 ViewModel이 받고, Model과 데이터를 주고받아 데이터 바인딩으로 뷰의 상태를 갱신함 - 애니메이션, 액티비티 전환 등 ViewModel에서 구현하기 어려운 항목이 있는데, 그러한 부분은 뷰에서 구현한다. |
- 데이터를 표시한다. - ViewModel이 가진 값이 데이터바인딩을 통해 자동적으로 반영되므로 따로 값 반영을 구현해줄 필요는 없다. |
MVVM의 장점
- 액티비티를 작게 만들 수 있다.
- 데이터를 뷰에 반영하는 로직을 작성할 필요가 없다.(액티비티의 코드 더 간결)
- 뷰에 의존하는 코드가 없어 테스트가 쉬움
MVVM의 단점
- 바인딩 관련 처리는 자동으로 생성되며, 블랙박스화되어있다. 자동으로 생성된 코드는 일반적으로 가독성이 낮고, 디버그하기 힘들다.