[Android, MVP] 리뷰 받은 MVP 예제 with Room
안녕하세요. 블랙진입니다.
2019 드로이드 나이츠에서 우연찮게 코드 리뷰 받을 수 있는 기회가 생겨 MVP 기본 예제 - Room 활용 예제를 리뷰받아 보았습니다. 구글에서 제안하는 MVP 에 맞게 잘 작성했는지 요청을 드렸는데요. 이때 받은 피드백을 반영하여 새로 다듬은 MVP에 대해 포스팅하겠습니다.
- 2019 드로이드 나이츠 후기는 여기서 확인할 수 있습니다 :)
MainPresenter
<기존>
MainPresenter() {
this.api = GithubApiProvider.provideGithubApi();
this.disposable = new CompositeDisposable();
}
<수정>
MainPresenter(MainContract.View view,
GithubApi api,
UserDao userDao,
CompositeDisposable disposable) {
this.view = view;
this.api = api;
this.userDao = userDao;
this.disposable = disposable;
}
MainPresenter 생성자에서 view, api, dao, disposable 을 받아오게 수정했습니다. 기존에는 MainPresenter 에서 객체를 생성해 초기화 해주었지만 외부에서 객체를 주입해 의존성을 낮추는 것이 좋은 방법입니다.
MainActivity
<기존>
@Override
public void onClick(User user) {
// UserDatabase 에 저장합니다.
presenter.addUser(
UserDatabaseProvider.getInstance(this).getUserDao(),
user);
// DetailActivity 로 이동합니다.
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra(DetailActivity.KEY_USER, user);
startActivity(intent);
}
<수정>
View
@Override
public void onItemClick(User user) {
presenter.addUser(user);
}
Presenter
@Override
public void addUser(User user) {
disposable.add(
Observable.just(user)
.subscribeOn(Schedulers.io())
.subscribe(
item -> {
userDao.add(item);
view.goToDetailActivity(user);
},
error -> {
view.showViewToast(error.getMessage());
}
)
);
}
MainActivity 에서 유저를 클릭하면 room 에 데이터를 저장하고 DetailActivity 로 이동하는 로직입니다. 여기서는 room 에 데이터를 저장하는데 실패 혹은 성공 여부에 상관 없이 DetailActivity 로 이동하게 되어 있습니다. 이를 Presenter 에서 Model 인 room 의 데이터 결과를 받고 처리 할 수 있게 수정 했습니다.
코드 네이밍
1. Package 에서는 모두 소문자로 쓴다.
rxEventBus -> exeventbus 로 수정
2. 초기화는 init 으로 해준다.
setRxEventBus -> initRxEventBus
정리
기존 코드에서는 Model 에서 받은 데이터의 반환 여부와 상관없이 View 코드를 실행시켰습니다. 이 부분에서 Model 에서 값을 받고 Presenter 에서 반환 값을 확인 후 View 를 실행시켜 주는 부분의 작성이 많이 미흡하다는 것을 느꼈습니다. 그 외에 네이밍 규칙이나 사소한 부분에 대해 많은 조언을 받았습니다.
수정된 코드는 깃허브에서 확인하실 수 있습니다. 추후 Dagger 를 활용하여 코드를 좀 더 다듬어 공유하겠습니다.