안드로이드 앱을 구성하는데 있어 베스트 프랙티스 패턴을 크게 고려하지 않는 편이었는데, (아마 전통적인 형태의 MVC에 가깝게 짜여지지 않았을까) 중장기간 개발과 유지보수, 업그레이드 및 테스트에 관련해 세가지 패턴을 알고 그에있는 장단을 알아두는 것은 분명하게 필요해보인다.
Realm 아카데미에 세가지 패턴에 대해 아주 잘 설명해 둔 자료가 있어 이를 참조해 간단히 정리하며 익혀본다.
시작하기에 앞서 Best practice 접근법에 대해 보자면
What is Best practice?
- Best practice 접근법이란 안드로이드 앱을 논리적 구성요소로 체계화하기 위해 생겨남.
- MVC 패턴을 초석으로 모듈화되고 테스트 가능한 패턴으로 발전해 왔다.
- MVP와 MVVM 패턴은 MVC를 대체하기 위해 가장 많이 쓰이는 대안책이다.
- MVP와 MVVM에 대한 선호도나 유용성면에서 개발자들에 따라 갈리는 편으로, 일치된 의견을 만들지 못한 상황.
1. MVC(Model View Controloler)
- Model
데이터 + 상태 + 비즈니스 로직으로 구성되어 앱의 두뇌역할 담당. 뷰나 컨트롤러에 묶이지 않음(독립적)
- View
Model의 표현으로 사용자가 앱과 상호작용할 때 컨트롤러와 통신을 맡음.
View는 소위 멍청하고 모델에 종속되지 않음(하위모델에 대한 지식, 상태에 대한 이해가 없음)
- Controller
앱의 접착제 역할을 맡으며 앱에서 발생하는 일을 담당하는 Master Controller를 맡음.
주로 Activity나 Fragment로 표현됨.
- 장점
훌륭하게 모델과 뷰를 분리. 모델은 어디에도 종속되지 않음.
유닛테스트에서 뷰는 테스트할 것이 없어 쉽게 모델을 테스트 가능.
- 단점
컨트롤러의 문제점으로
1)테스트 용이성 - 컨트롤러가 안드로이드 API에 깊게 종속, 유닛테스트 어려움
2)모듈화 및 유연성 - 컨트롤러가 뷰에 단단히 묶이며 뷰의 확장이 될 수도 있음.
뷰를 바꾸면 컨트롤러도 바꾸어야 함.
3)유지보수 - 시간이 지남에 따라 컨트롤러가 비대해지며 문제가 발생하기 쉬워짐.
anemic models 모델을 사용하는 앱이라면 더욱. (anemic model에 대해 향후 알아볼것)
2. MVP(Model View Presenter)
- Model
MVC와 동일
- View
액티비티와 프래그먼트가 뷰의 일부로 간주됨.
액티비티가 뷰 인터페이스를 구현해 Presenter가 코드를 만들 인터페이스를 갖게 하는것을 권장.
> 특정 뷰와의 결합없이 가상 뷰를 구현해 간단한 유닛 테스트 실행이 가능
- Presenter
MVC의 컨트롤러와 같으나 뷰와 연결되지 않고 인터페이스로 구현됨.
MVC가 가진 테스트 가능성 문제, 모듈화/유연성 문제를 해결.
Presenter가 어떤 안드로이드 API나 코드도 참조하지 않는 것을 권장(극단적 MVP 추종자들의 의견)
- 장점
MVC보다 깔끔함. 안드로이드 고유의 뷰와 API에 연결되지 않음.
View interface를 구현해 사용했다면 어떤 뷰와도 작업이 가능 > Presenter 로직을 쉽게 테스팅
- 단점
유지보수 : MVC의 컨트롤러처럼 로직이 방대해질 수 있고 이를 분리하기가 어려워지게 됨.
3. MVVM(Model View ViewModel)
- Model
MVC와 동일, 변화없음
- View
ViewModel에 의해 보여지는 Observable 변수와 유연히 바인딩됨.
- ViewModel
Model을 래핑하며 View에 필요한 Observable 데이터를 준비.
View가 Model에 이벤트를 전달할 수 있도록 Hook을 준비.
뷰에 종속되지 않음.
- 장점
View에 대한 의존성 없어 유닛 테스트가 더 쉬워짐.
MVP 패턴처럼 테스트를 위한 가상 뷰를 만들 필요 없음.
> 테스트할때 모델이 변경되는 시점에 Observable 변수가 제대로 설정되었는지 확인하면 됨.
- 단점
유지관리 :
View가 변수 및 표현식 모두에 바인딩 될 수 있음.
> 관계없는 Presentation 로직이 늘어나 XML에 코드를 추가하게 될 수 있음.
> 이를 방지하기 위해서는 View 바인딩 표현식에서 값을 계산하거나 파생하지 않고 뷰모델에서 직접
가져오는 것이 좋음(중요해보인다) > 유닛테스팅
4. 각 패턴에 대해 모아 비교해보자
단순 도식을 캡처해 묶은것으로, 상세 코드 형식에 대해서는 원본 페이지를 참조할 것.
MVC
MVP
MVVM
<출처>
https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/
'LANGUAGES, METHODLOGY > STUDY' 카테고리의 다른 글
[STUDY] 깨끗한 코드란 무엇일까? 로버트 C.마틴의 클린 코드 (0) | 2022.11.13 |
---|---|
[객체지향] 최소 지식의 원칙 (0) | 2021.11.14 |
[Q&A] Question of myself - 무엇을 하고 싶은가? (0) | 2019.02.06 |
[RxJava] RxJava란 무엇인가? (0) | 2019.01.30 |
[Unity] 유니티란 무엇인가? (나무위키 요약) (0) | 2019.01.27 |