본문 바로가기

LANGUAGES, METHODLOGY/STUDY

[안드로이드] MVC, MVP, MVVM에 대해 알아보자

안드로이드 앱을 구성하는데 있어 베스트 프랙티스 패턴을 크게 고려하지 않는 편이었는데, (아마 전통적인 형태의 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/