이번에는 MVP 패턴에서 사용할 수 있는 다양한 Model을 살펴보겠다.

Model이란?

Model은 Data를 말한다. 단순 데이터가 아닌 데이터를 관리/수집/수정 등을 하게 되는 부분이다. 데이터를 Cache해야 한다면 이 모델에서 Cache 할 수도 있고, 그냥 단순 데이터 전달만 할 수도 있다.

Google Architecture의 Model

Google Architecture는 아래와 같은 그림으로 설명할 수 있다.

각각의 역할은 아래와 같다.

  • Respositroy : Remote/Local을 구분하며, Memory cache를 포함
  • Remote : 서버를 통한 데이터를 불러온다.
  • Local : 단말기 상의 SQL, Realm 등을 통한 데이터를 불러온다.

구현한 모델은?

현재까지 MVP에서 정의한 모델은 단순 리턴을 하며, Model만 구분을 해두었다. 싱글톤을 통해서 데이터 클래스에 접근하도록 만들었다. 데이터 형태에 따서 여러 개가 만들어질 수도, 단일 클래스로 생성될 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SampleImageData {
private SampleImageData() {}
private static SampleImageData sampleImageData;

public static SampleImageData getInstance() {
if (sampleImageData == null) {
sampleImageData = new SampleImageData();
}
return sampleImageData;
}

public ArrayList<ImageItem> getImages(Context context, int size) {
ArrayList<ImageItem> items = new ArrayList<>();
// 생략
return items;
}
}

위와 같이 자바로 하나의 클래스에 싱글톤으로 만들 수 있다. 가장 기본적인 형태의 모델이다. 코틀린으로 작성할 경우 Object로 작성하면 된다.

Presenter에서는

위에서 작성한 모델은 Presenter에서 세팅하는 주체는 View이다. Presenter 초기화하는 대상이 View이기 때문에 View를 초기화함과 동시에 Model을 초기화하게 된다.

1
2
3
4
5
6
presenter = MainPresenter().apply {
view = this@MainActivity
imageData = ImageData
adapterModel = imageAdapter
adapterView = imageAdapter
}

위와 같이 초기화를 진행하고, Presenter에서 다음과 같이 사용하게 된다. getItems()를 토애서 데이터를 불러오고 이를 사용하게 된다.

1
2
3
4
5
6
7
8
9
@Override
public void loadItems(Context context, boolean isClear) {
ArrayList<ImageItem> items = sampleImageData.getImages(context, 10);
if (isClear) {
adapterModel.clearItem();
}
adapterModel.addItems(items);
adapterView.notifyAdapter();
}

참고