안드로이드에서 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와 같은 디자인 패턴은 어플리케이션을 구성하는 코드를 굉장히 모듈화시킬 수 있습니다. 따라서, 협업 시 각각 전문 분야에서만 작업을 해도 됩니다. 그리고 각 기능이 어느 소스 파일에 있는지 찾기가 더 쉬워지겠죠. 무엇보다 더 큰 이유론 유닛 테스트에 용이해진다는 점이 있습니다. 이렇게 전체적인 유지보수가 쉬워집니다.
개인적으로 유닛 테스트는 아직 모르니 공부해본 후 포스팅할 예정입니다.. :)
'Programming > Language Tip' 카테고리의 다른 글
안드로이드 - MVP 패턴 2. 분석 (4) | 2017.05.12 |
---|---|
안드로이드 - 서비스와 액티비티간 통신 (0) | 2017.05.08 |
안드로이드 - MVC 패턴 개념, 안드로이드에서 MVC 패턴의 미묘함 (3) | 2017.03.11 |
안드로이드 - 외부 스레드에서 UI 스레드로 (0) | 2017.03.11 |