이번에는 MVP 따라하기 4번째 시간이다. 저번 글에서 Android MVP 적용하는 방법 중 구글에서 추천하는 Presenter / View 인터페이스를 Contract 인터페이스에 선언해서 사용하는 방법을 다루었다.

이번에는 Presenter/PresenterImpl을 구현하는 방법을 살펴보려고 한다.

Presenter interface 구현하기 전에

이전 글에서는 구글에서 추천하는 방법인 Contract을 통해서 interface을 구현하는 방법을 살펴보았고, 구글의 MVP 패턴 적용하는 방법을 살펴보았다.

여기서는 많이 사용되는 2번째 방법을 소개하려 한다.

  • Presenter : interface로 구현하며, View를 포함
  • PresenterImpl : Presenter interface를 상속받아서 구현

이번 글에서도 기존과 같은 방식으로 접근하지만 interface 생성하는 방법을 달리하였다.

Present interface 구현

구글은 Contract을 통해서 View/Presenter의 interface 2개를 작성하였지만, 다음의 방법은 Presenter에 View interface만을 작성하였다. 그래서 구현하면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
interface SamplePresenter{
// Presenter 구현

void loadItem();

interface View{
// 해당 Presenter에서 사용할 View 구현
void updateView(List<Items> items);
}
}

PresenterImpl 구현

다음과 같이 implements를 통해서 상속받고, 이를 아래와 같이 구현한다. 다만 이름은 implements의 구현체의 이름으로 Impl을 사용한다.

1
2
3
4
5
6
7
8
9
class SamplePresenterImpl(val view : SamplePresenter.View) : SamplePresenter{

// 상속받은 interface 구현
override fun loadItem(){
// ...
val list = ArrayList<String>()
view.updateView(lise)
}
}

View 구현

SamplePresenter인 SamplePresenterImpl을 초기화하여 사용한다. 사용법은 Contract을 통한 생성과 동일하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class SampleActivity extends AppCompatActivity implements SamplePresenter.View {

private SamplePresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

presenter = new SamplePresenterImpl(this);

presenter.loadItem();
}

@Override
public void updateView(List<Items> items) {
// UI 갱신
}
}

Presenter interface가 없는 경우

추가로 Presenter interface을 사용하지 않는 경우이다. Presenter에 대한 interface을 사용하지 않기 때문에 View에 대한 interface만을 정의한다.

1
2
3
interface SampleView{
fun updateView(var items : List<Items>)
}

그리고 다음과 같이 Presenter를 구현한다.

1
2
3
4
5
6
7
8
class SamplePresenter(val view : SampleView){

fun loadItem(){
// ...
val list = ArrayList<String>()
view.updateView(list)
}
}

그리고 다음과 같이 View의 사용이 가능하게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SampleActivity : AppCompatActivity, SampleView{
private var presenter : SamplePresenter

override fun onCreate(var savedInstanceState : Bundle){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

presenter = SamplePresenter(this)
presenter.loadItem()
}

override fun updateView(var items : List<Items>){
// UI 갱신
}
}

참고