Programming/Language Tip

안드로이드 - MVP 패턴 1. 개념

awesometic 2017. 5. 10. 16:14
반응형

 안드로이드에서 MVC 패턴의 미묘함에 대해 포스팅한 적이 있습니다.

2017/03/11 - [프로그래밍/기타] - 안드로이드 - MVC 패턴 개념, 안드로이드에서 MVC 패턴의 미묘함


 그래서 안드로이드의 MVP 패턴을 공부하고 있는데, 구글에서 샘플 코드도 올려주고 아주 친절해요.

https://github.com/googlesamples/android-architecture

 여기서 일정관리 프로그램를 다양한 디자인 패턴을 통해 개발하는데, 이 중엔 MVP에 기반한 것도 있습니다.

 이걸 분석하면서 한창 앱 하나를 개발하고 있습니다. 이번 포스트 시리즈는 그 나름의 분석 내용입니다. 그리고 앱의 기능을 분석한다기 보다 MVP 패턴으로 개발하려면 이렇게 하면 되는구나는 걸 추출하려고 노력했습니다.

 참고하실 분은 틀린 내용이 있을 수 있으니 의구심을 가지고 읽어주세요 :)




1. 개념

 MVP 패턴은 Model-View-Presenter 로 이루어집니다. 그리고 각각,

 Model : 데이터 관리
 View : 화면 표현
 Presenter : Model과 View를 이어주는 다리

 역할을 합니다.

 그러니까, 기본적으로 모든 데이터 관리는 Model에서, 모든 화면 표현은 View에서 이루어진다고 생각하시면 됩니다. 그리고 각각을 부르고 그 결과를 짬뽕시키는 애가 Presenter입니다.

 버튼을 누르면 버튼 밑에 현재 시간이 뜨는 안드로이드 어플리케이션을 상상해봅시다.

 사용자 입장
 1) 버튼을 누름
 2) 버튼 밑에 현재 시간이 뜸

 앱의 입장
 1) M, V, P 초기화 : 앱이 생성되면서 Model, View, Presenter가 생성되고 등록됨
 2) P -> V : Presenter가 View한테 버튼을 그리라고 시킴
 3) V 동작 : 버튼을 그려놓고 대기
 4) 사용자가 버튼을 눌러버림
 5) V -> P :View가 Presenter한테 버튼이 눌렸다고 알림
 6) P -> M : Presenter가 Model한테 지금 몇 시냐고 물음
 7) M 동작 : Model이 시계를 봐서 현재 시간을 구함
 8) M -> P : Model이 Presenter한테 현재 시간을 알려줌
 9) P -> V : Presenter가 View한테 현재 시간을 버튼 밑에 그리라고 시킴
 10) V 동작 : View가 버튼 밑에 현재 시간을 그림

 이런 느낌입니다.

 보면 아시다시피, 일은 Model이 하고 사용자한테 보여줄 화면은 View가 그립니다. Presenter는 둘을 이어줘요. 각자의 할 일 외에는 절대 침범하지 않습니다.


* MVC와 MVP의 차이?

 MVC는 Model-View-Controller 로 코드를 나누는 디자인 패턴입니다.

 Model과 View에 대해선 MVC와 MVP가 역할이 같지만, Controller와 Presenter는 비슷한 듯 다릅니다. 일단 사용자의 이벤트에 대해 첫 번째로 반응하는 애가 다릅니다.

 PHP Codeigniter 같은 MVC 패턴은 사용자가 새로운 URL에 대한 접근을 요청했을 때 Controller가 먼저 반응해 해당 URL에 맞는 View를 가져와 적절한 작업 후 반환합니다.

 안드로이드에서 사용할 수 있는 MVP 패턴은 사용자가 새로운 이벤트를 요청할 때 View가 먼저 반응한 후 Presenter에 알려, 적절한 작업 후 다시 View한테 알립니다.

 이렇듯 그 순서가 처음부터 다릅니다.

 안드로이드에선 MVC패턴이 미묘한 이유가, 사용자의 입력에 대한 반응이 View가 첫 번째일 수 밖에 없어 View가 곧 Controller의 역할도 해야만 하기 때문입니다. 

 더 자세하고 좋은 내용은 http://pluu.github.io/blog/android/2016/12/30/android-mvc-mvp-diff/


* 엄청 복잡해지네요. 왜 이런 짓을?

 MVP와 같은 디자인 패턴은 어플리케이션을 구성하는 코드를 굉장히 모듈화시킬 수 있습니다. 따라서, 협업 시 각각 전문 분야에서만 작업을 해도 됩니다. 그리고 각 기능이 어느 소스 파일에 있는지 찾기가 더 쉬워지겠죠. 무엇보다 더 큰 이유론 유닛 테스트에 용이해진다는 점이 있습니다. 이렇게 전체적인 유지보수가 쉬워집니다.

 개인적으로 유닛 테스트는 아직 모르니 공부해본 후 포스팅할 예정입니다.. :)

반응형