-
MVP 패턴 기초 - Google Architecture을 활용한 설계Android 2020. 2. 23. 22:21
들어가며 : 디자인 패턴과 사용하는 이유
MVP패턴의 목적과 구조
Google Architecture
View, Presenter, Model 정의
마치며
더 읽을거리
들어가며 : 디자인 패턴과 사용하는 이유
개발을 시작한지 얼마안된 저에게 디자인 패턴은 먼 나라 얘기였습니다.
단순히 기능 구현하는데도 벅찬 저에게 가독성이 좋고 확장성을 고려한 코드 작성은 아직 멀게 느껴지기만 했습니다.
하지만 개발 공부를 계속하다보니 좋은 코드의 중요성을 알게 됐습니다. 프로젝트를 유지, 보수하고 새로운 기능을 개발 할 때도 이해하기 쉽고 수정이 쉬운 코드가 필요하고 시간이 흐른 뒤 제가 진행했던 프로젝트를 리팩토링 할 때도 구조화된 코드가 이해하기 훨씬 쉬웠습니다.
디자인 패턴은 많은 실무 프로그래머들이 인정한 효율적인 코딩 방법 또는 구조입니다. 효율적인 코딩 방법이란 코드가 명확하고 단순하며 재사용성이 높고 리소스의 낭비가 없거나 최소화 하는 등의 방법을 말합니다.
거창한 디자인 패턴이 아니어도 상관없습니다. 싱글톤 패턴과 팩토리 패턴, 옵서버 패턴도 모두 디자인 패턴 중 하나이고 여러 디자인 패턴을 접해보고 활용해보면서 프로젝트를 좀 더 효율적이고 나은 코드로 개선하는 것이 필요하다고 생각합니다.
MVP패턴의 목적과 구조
디자인 패턴을 적용하지 않은 프로젝트에선 하나의 Activity에서 모든 역할을 수행할 것입니다.
소규모 프로젝트에서는 큰 문제가 되지 않을 수 있지만 기능이 추가될수록
Activity내의 코드는 더 길어지고 Unit Test를 하기에 적절하지 않은 구조가 될 수 있습니다.
따라서 이를 해결하기 위해 MVP 구조를 적용합니다.
MVP는 뷰와 모델간의 의존성을 분리하고 비즈니스 로직 처리를 프레젠터에서 담당함으로써
뷰에 과도한 코드가 작성되는 것을 방지합니다.
- Model : 데이터, 상태, 비즈니스 로직을 담당
- View : Activity, Fragment, xml등 UI를 나타내는 부분이며 Presenter에 이벤트를 전달
- Presenter : View로부터 받아온 이벤트를 처리하고, Model을 업데이트합니다.
Google Architecture
MVP 구조를 공부할 때 많은 사람들이 참고하는 글이 있는데요,
'꿈 많은 개발자가 되자'의 Taehwan님의 글입니다.
Android MVP 무작정 따라하기라는 글 연재 게시글이 정리가 매우 잘되있는데요.
저 역시 여기서 많이 참고하고 공부했던 것 같습니다.
무작정 따라하기의 연재글은 Google Architecture를 많이 참고하신걸로 알고있는데요.
해당 글에 의하면,
- Presenter의 생성은 View가 아닌 실제 View가 만들어지는 시점의
Activity / Fragment / View 등에서 생성을 하고 해당 Presenter 에 setView를 실행합니다. - setView가 호출되는 시점에 자기 자신(this)을 setPresenter 함수를 통해서 실제 Presenter가
사용되어야 할 View에 전달합니다. - View에서는 setPresenter를 통해서 전달받은 Presenter를 가지고 이후 loadItem,
onClickListener 등의 처리를 합니다.
interface RamenContract { interface RamenView { fun setRamen() fun callMeal() } interface RamenPresenter{ fun boilWater() fun dropRamen() } }
Contract의 정의에 따라서 View와 Presenter의 추상 메서드를 만듭니다.
단, View와 Presenter의 정의에 따라 View는 이벤트 호출과 뷰를 설정하는데 필요한 메서드,
Presenter는 호출받은 이벤트에 따라 로직을 처리하고 모델로부터 데이터를 가져오고 업데이트하는
메서드를 정의합니다.
class View : AppCompatActivity(), RamenContract.RamenView { var presenter : RamenContract.RamenPresenter = RamenPresenter() override fun setRamen(){ } override fun callMeal(){ } }
참조
https://thdev.tech/androiddev/2016/12/29/Android-MVP-Model-One/
https://medium.com/@PaperEd/android-how-to-mvp-1ff398b25cb1
https://brunch.co.kr/@mobiinside/913'Android' 카테고리의 다른 글
Gson을 통해 API Response를 Enum으로 매핑하기 (0) 2020.09.25 [안드로이드 9.0 프로토콜 접속 변경사항] CLEARTEXT communication to XXXX not permitted by network security policy (0) 2020.07.24 SharedPreference 이야기 (0) 2020.06.19 EditText 자동 포커스 기능 막기 (0) 2020.05.25 프래그먼트와 백스택, 그리고 엑티비티 (0) 2020.05.20