현재 안드로이드 아키텍처 스터디를 하고 있습니다. 배운 내용을 정리해 보려고 합니다.
MVP패턴에서 View는 유저와의 인터렉션만(IN/OUT) 처리하도록 합니다. Model에는 Remote/Local DataSource/ Repository가 있을 수 있습니다. Presenter에서는 유저의 input이 들어왔을 때, 어떠한 처리를 해야 하는지에 대한 로직이 포함됩니다. 유저가 버튼을 눌렀을 때, 어떠한 처리를 해야하는지에 대한 것이 Presenter에 구현되어야 합니다. MVP에서 View는 유저로 부터 input을 받고 그것을 Presener로 전달 하는 역할만 합니다.
VictoryWoo님의 블로그에 MVP에 대해 잘 설명해 주신 그림이 있어서 첨부했습니다.
https://woovictory.github.io/2019/01/16/Android-MVP-Step1/
저의 경우는 아래 블로그를 참조하여 Presenter Interface를 만들고, 이를 구현하는 방식으로 MVP를 처리하였습니다.
interface MoviePresenter {
fun searchMovie(q:String)
interface View {
fun showToast(m:String)
fun setMovieData(list: List<Movie.Item>)
fun clearList()
}
}
View -> Presenter 로 사용되어야 할 함수는 search 버튼이 눌렸을 때 수행되는 searchMovie(q:String)입니다.
Presenter -> View로 사용되어야 할 함수는 View interface에 정의된 함수들 입니다.
View에서는 Presenter interface에 정의된 View를 구현 합니다.
class MainActivity : AppCompatActivity(), MoviePresenter.View {
그리고 presenter 객체를 생성합니다.
movieContainer = (application as
CommonApplication).movieContainer
presenter = MoviePresenterImpl( this, movieContainer.repository)
버튼이 눌렸을 때, presenter의 searchMovie()를 호출 하여 줍니다.
btnSearch.setOnClickListener {
presenter.searchMovie(etUrl.text.toString())
}