Programming/AndroidProgramming

MVP 패턴이란?

Polyglot 2018. 7. 4. 20:21

안녕하세요 ! 오늘은 MVP 패턴에 관해서 알아보도록 하겠습니다.


안드로이드 프로그래밍을 하다보면 액티비티에 로직 코드를 넣어서 코딩을 하는 경우가 많은데요.

그러다보면 코드가 얽히고 섥혀서 나중에 코드를 리뷰하거나, 추가, 수정을 할때 복잡해서 힘들 때가 분명 생깁니다.

(그러한 코드를 스파게티 코드라고 부릅니다.)


이를 방지하기 위해서 많은 프로그래머가 어떻게 하면 방지할 수 있을지를 논의하였고 MVP 패턴을 사용하면 스파게티 코드를 방지하고 코드의 간결함과 유닛 단위 테스트를 하기 용이하다고 말합니다.


그렇다면 MVP 패턴이란 무엇일까요??


1. MVP 패턴의 기본요소


MVP 패턴은 Model, View, Presenter 3개의 층으로 프로젝트를 구성하는 방법을 말합니다. 


Model(모델) : 데이터를 의미하고 데이터에 관한 메서드를 처리합니다. 


Presenter(프레젠터) : 데이터와 뷰 사이에 위치하며 모델으로 부터 데이터 받기, 뷰에게 화면 갱신등.. 로직 처리를 담당합니다.


View(뷰) : 보여지는 화면을 뜻하며 액티비티, 프레그먼트, 뷰가 이 계층에 속합니다.


2. MVP 패턴의 Contract와 Interact


그 외에도 MVP 패턴을 효과적으로 사용하기 위해서 Contract나, interact를 정의하기도 합니다.


Contract는 인터페이스로써 View와 Presenter사이에 위치하며, inner 인터페이스로 View와 Presenter를 정의합니다. Presenter와 View 인터페이스를 여기에 정의합니다.


Interact는 데이터 베이스나 웹서비스, 다른 데이터 소스로 부터 데이터를 받아오고 프레젠터에 데이터를 보내는 역할을 담당합니다. 굳이 위치를 정의하자면 Presenter와 Model 사이로 생각 해볼 수도 있습니다.


3. StopWatch 예제

MVP패턴으로 구현되어있지 않은 StopWatch를 MVP 패턴으로 구현을 해보면서 자세히 알아가보도록 하겠습니다.

위 예제는 스타트 버튼을 누르면, 카운트가 올라가고 스톱을 누르면, 멈추고 리셋을 누르면, 0으로 초기화되면서 멈추는 아주 간단한 예제입니다.


아래의 코드는 MVP 패턴을 적용하지 않은 스톱워치의 MainActivity 코드입니다.


위 예제는 MVP 패턴을 적용하지를 않아서 코드를 읽어보면 한번에 파악하기는 편하나
코드가 복잡해졌을때 스파게티코드가 될 가능성이 농후합니다.위의 코드를 MVP 패턴을 적용해서
한번 고쳐보겠습니다.



단순히 MainActivity.java만 있는 것이 아니라 model 패키지와 presenter 패키지를 정의합니다.
그리고 model 패키지안에는 시간을 정의하는 Time 클래스를 넣고 
presenter 패키지에는 뷰와 프레젠터를 연결하는 Contract 인터페이스와 Presenter를 구현하는 클래스를 만듭니다.


시간 데이터를 저장할 수 있는 Time 클래스를 정의합니다. 초와 재생되고 있는 중인지 판별하는 불리언 값을 가집니다.

Contractor는 presenter와 view사이에 위치하고 연결하기위해 사용합니다. Mainview 인터페이스는 Activity가 상속받을 것이고
MainPresenter는 MainPresenterImpl을 구현시킬 것입니다..
presenter는 뷰를 설정하는 것과, 버튼을 클릭했을때, Thread처리 같은 로직을 구현하도록 합니다.



presenter 인터페이스를 상속받아서 각각 메소드의 로직을 구현합니다. presenter는 view와 data를 접근할 수 있도록
뷰의 값을 가지고 있어야되고 데이터의 값을 가지거나 interactor를 사용한다면 interactor의 값을 가지고 있어야합니다.
위 코드는 interactor를 사용하지 않으므로 데이터 값인 time 값을 가지고 있습니다. 

그리고 Serializable 인터페이스를 상속받아서 Activity에서 Bundle 파일에 넣을 수 있도록 합니다.



위 코드는 MVP 패턴을 적용한 MainActivity.java 입니다. 
presenter를 사용해서 모든 로직은 presenter에 위임하였고 
오로지 MainActivity는 화면을 보여주고 출력하는 것에만 집중하도록했습니다.


4. 결론

MVP 패턴은 안드로이드 프로그래밍을 할때 쉽게 코드가 얽히고 섥혀서 프로젝트가 커진다면 새로운 것을 추가하거나 리뷰하기 힘들지 않도록 방지합니다.


Activity는 화면 출력에만 집중하도록하고 로직은 Presenter에 위임하고 데이터 송수신을 담당시킵니다.

MVP를 사용함으로써 얻을 수 있는 장점으론

1. 가독성있고 유지력있는 코드

2. 높은 독립성을 보장하는 모듈적 코드

3. 테스트하기 용이한 코드

을 장점으로 가지게 됩니다.