✨ 아키텍처 패턴 (Architecture Pattern), MVC에 대해 알아보기
위 글을 먼저 읽고 오시면 더 도움이 됩니다 :)
Model, View, Presenter
View와 Model의 결합도가 높은 MVC 패턴의 문제점을 보완하기 위해 만들어짐
Presenter를 통해서만 View와 Model이 동작함
ModelViewPresenter
사용자 Action 순서
1. View : 사용자 이벤트 발생
2. View -> Presenter : 사용자 이벤트 전달
3. Presenter -> Model : 데이터 요청
4. Model -> Presenter : 요청한 데이터를 전달
5. Presenter : Model에서 전달받은 데이터 정제
6. Presenter -> View : 정제한 데이터 전달
7. View : Presenter에서 전달받은 데이터 보여줌

interface BasePresenter<T> {
fun takeView(view : T) // View가 생성(bind) 될 때 Presenter에 전달
fun dropView() // View가 제거(unBind) 될 때 Presenter에 전달
}
interface Contract {
interface View {
fun A() // 값을 보여줄 View 메소드 선언
}
interface Presenter: BasePresenter<View> {
fun B() // 값을 구하기 위한 메소드 선언
}
}
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
}
}
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()
}
}
}
📂com.example.MVP
┣ 📂db
┣ 📂network
┣ 📂presenter
┃ ┣ 📂BasePresenter
┃ ┣ 📂Contract
┣ 📂ui
┃ ┣ 📂main
┃ ┣ 📂search
┃ ┣ 📂review
┗ 📂utils
DB, API, SharedPreference, ~~Model(Data) 등Activity, Fragment, .xml 등 UI 로직contract, presenter 등 인터페이스 및 처리 로직장점
- MVC에 비해 코드가 깔끔해짐
- Model과 View 간의 결합도를 낮추어 확장성이 좋아짐
- 테스트 코드 작성 시 용이
단점
- 애플리케이션이 복잡해질수록 View와 Presenter 사이의 의존성이 강해짐
Example
MovieReview Example with Naver API - hyooosong github
Reference
MVP + kotlin Example
안드로이드 아키텍처 패턴 - MVP가 뭘까?