[Android] 아키텍처 패턴 (Architecture Pattern), MVP ?

hyooosong·2022년 1월 18일
0
post-thumbnail

✨ 아키텍처 패턴 (Architecture Pattern), MVC에 대해 알아보기
위 글을 먼저 읽고 오시면 더 도움이 됩니다 :)


MVP 패턴

Model, View, Presenter

View와 Model의 결합도가 높은 MVC 패턴의 문제점을 보완하기 위해 만들어짐
Presenter를 통해서만 View와 Model이 동작함

  • Model
    - 프로그램 내부적으로 쓰이는 데이터를 저장하고, 처리하는 역할 (비즈니스 로직)
    - View 또는 Presenter 등 다른 어떤 요소에도 의존적이지 않은 독립적인 영역
  • View
    - UI를 담당 (Activity, Fragment 등)
    - Model에서 처리된 데이터Presenter를 통해 받아서 유저에게 보여줌
    - User Action 및 Activity LifeCycle 상태 변경을 주시하여 Presenter에 보냄
    - Presenter를 이용해 데이터를 주고받기 때문에 Presenter에 매우 의존적임
  • Presenter
    - Model과 View 사이의 매개체
    - MVC의 Controller는 View에 직접 연결되어 모델 - 뷰의 매개체 역할을 하지만,
    MVP의 Presenter는 인터페이스를 통해 상호작용

사용자 Action 순서
1. View : 사용자 이벤트 발생
2. View -> Presenter : 사용자 이벤트 전달
3. Presenter -> Model : 데이터 요청
4. Model -> Presenter : 요청한 데이터를 전달
5. Presenter : Model에서 전달받은 데이터 정제
6. Presenter -> View : 정제한 데이터 전달
7. View : Presenter에서 전달받은 데이터 보여줌


안드로이드에서의 MVP 는?

  • BasePresenter
interface BasePresenter<T> {
  fun takeView(view : T) // View가 생성(bind) 될 때 Presenter에 전달
  fun dropView() // View가 제거(unBind) 될 때 Presenter에 전달
}
  • Contract
    View와 Presenter를 연결하기 위한 Interface 파일
interface Contract {
  interface View {
	fun A() // 값을 보여줄 View 메소드 선언
  }
  interface Presenter: BasePresenter<View> {
	fun B() // 값을 구하기 위한 메소드 선언
  }
}
  • Presenter
    Model과 View를 연결하여 동작을 처리함
class MainPresenter : Contract.Presenter {
  private var mainView : Contract.View? = null
  
  // View와 Presenter 연결
  override fun takeView(view: Contract.View) { 
	mainView = view
  }

  override fun B() {

  }
  
  // View가 제거된 것을 Presenter에 알려줌
  override fun dropView() { 
	mainView = null
  }
}
  • Activity
class MainActivity : AppCompatActivity(). Contract.View {
  private lateinit var mainPresenter : MainPresenter

  override fun onCreate() {
	initPresenter()
	mainPresenter.takeView(this)
	onClickBtn()
  }

  override fun onDestroy() {
	mainPresenter.dropView()
  }

  override fun initPresenter() {
	mainPresenter = MainPresenter()
  }

  private fun onClickBtn() {
	btn.setOnClickListener {
	    mainPresenter.B()
	}
  }
}

MVP 패턴의 패키징 예시

📂com.example.MVP
┣ 📂db
┣ 📂network
┣ 📂presenter
┃ ┣ 📂BasePresenter
┃ ┣ 📂Contract
┣ 📂ui
┃ ┣ 📂main
┃ ┣ 📂search
┃ ┣ 📂review
┗ 📂utils

  • Model : DB, API, SharedPreference, ~~Model(Data)
    데이터 파일과 데이터 처리 관련 로직
  • View : Activity, Fragment, .xml 등 UI 로직
  • Presenter : contract, presenter 등 인터페이스 및 처리 로직

MVP 패턴의 장단점

장점
- MVC에 비해 코드가 깔끔해짐
- Model과 View 간의 결합도를 낮추어 확장성이 좋아짐
- 테스트 코드 작성 시 용이

단점
- 애플리케이션이 복잡해질수록 View와 Presenter 사이의 의존성이 강해짐


Example
MovieReview Example with Naver API - hyooosong github

Reference
MVP + kotlin Example
안드로이드 아키텍처 패턴 - MVP가 뭘까?

0개의 댓글