mvc, mvp, mvvm 등 많은 Architecture 들이 있다.
먼저 왜 이러한 구조 방안이 생기게 되었을까?
1. 좋은 유지보수
2. 깔끔한 코드 분리
(특히 view, model 간의 분리)
3. Testing 가능한가
<MVC 패턴>
보통 mvc 패턴에서의 코드 사용
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
fab.setOnClickListener {
// 데이터 갱신 요청 코드
// fun getItems(): arrayList<>() // Model에 접근해서 데이터를 가져옴
// 위의 데이터를 이용해서 View 갱신
}
}
}
Controller는 위의 onClickListener이다.
listener안에서 데이터를 가져와 Model에 넣고, View에게 Model의 데이터를 입힌다.
=> MVC는 model, view, controller가 한군데에 섞여있다.
설명: 사용자 이벤트가 발생하면 데이터의 갱신 여부를 체크한다. 데이터를 로컬 또는 서버에서 받아오고 처리를 하고, 데이터 변경에 따른 UI 갱신이 필요하면 갱신 처리를 한다.
그렇다면, 안드로이드에서 더욱 자세히 살펴보자.
안드로이드는 Activity, Fragment 에서 View, Control 역할을 한다.
<MVP 패턴>
- 1990년대 초기에 MS에 공개한 패턴
- MVC 와 다르게 MVP는 Model과 View 간의 결합도를 낮출 수 있다.
View에 user event가 발생하면, Presenter를 할당 받는다.
Presenter는 Model을 업데이트 하고, 상태 체크 이벤트를 발생시킨다.
Presenter는 View에 변경된 Model을 전달해준다.
=> View는 Model을 알지 못해도 된다. Presenter가 대신 해주니까!
MVP패턴은 Controller 가 별도로 존재하지 않는다. View 에서 Controller 역할을 한다.
View는 Presenter만 알면 되고, Presenter는 모델만 알면 되는 구조.
View | Presenter | Model | |
역할 |
사용자의 실질적인 이벤트가 발생하고, 이를 처리 담당자인 Presenter로 전달 완전한 View의 형태를 가지도록 설계 |
View에서 전달받은 이벤트를 처리 후 이를 View에 전달 View와 Model을 이어주는 역할 |
데이터를 불러오거나 캐시처리 데이터의 전반적인 부분을 model에서 담당하고, 네트워크, 로컬 데이터 등을 포함 |
MVP 의 단점
- Class 하나만으로 전체 코드를 알 수 없다.
- interface 의 양이 많아진다.
- 메소드 수가 증가
- 익숙해지기 전까지 구조가 복잡할 수 있다.
<MVVM>
mvp와 비슷하다.
mvp와 차이점은 뭘까
View와 Presenter 는 1대1 관계이다. 즉, View 하나당 하나의 Presenter만 가진다.
반면 MVVC에서는 View와 ViewModel이 n대 n 관계이다.
예를 들어 Login 기능이 있다고 하자.
Login은 하나의 viewModel을 가진다. 그리고 로그인 처리는 여러 View에서 할 수 있다면, 여러 View들이 하나의 viewModel을 가져다 사용할 수 있다.
mvp 패턴에서도 n대 1 관계가 필요한 경우에 대한 방법이 있다.
mvp-clean-architecture 를 키워드로 검색을 해보시길.. (저도 안해봐서)
<MVVM>
결론은 개인에 맞는 Architecture를 선택하면 된다.
- MVC: view에서 model을 사용하기 때문에 코드 분리를 잘 해야 한다.
- MVP, MVVM: view, model의 결합도를 낮출 수 있다.
- 컴포넌트를 잘 분리해서 좋은 테스팅 환경을 만드는게 중요하다.
https://developer.android.com/topic/libraries/architecture 에 대해 자세히 찾아보고 공부하자
'android' 카테고리의 다른 글
RxJava 의 핵심 기술 - concat, merge, zip (0) | 2020.02.27 |
---|---|
RxJava 란 (0) | 2020.02.04 |
How to draw Rect Overlay View? (0) | 2020.01.05 |
ViewPager를 가진 Dialog 구현 주의사항 (0) | 2020.01.02 |
Android UI Thread와 Custom Thread에서의 UI 처리 (0) | 2019.08.05 |