티스토리 뷰



업무 시간 외에 개인 시간을 투자하여 프로젝트 개발에 착수했습니다.


개발 일지를 작성하여 개발했던 기록들을 남겨놓으려 합니다.



* Java, MVP


우선, 개발언어는 Java 를 이용하기로 했습니다.

개인 프로젝트지만, 기간을 정해놨기 때문에 Kotlin 을 배우면서 하기엔 러닝커브가 있다고 판단 했기 때문입니다.


아키텍쳐 디자인 패턴은 MVP 를 사용하기로 했는데, 

마찬가지로 MVVM 패턴은 Kotlin 과 잘 어울린다고 생각해서

추후 Kotlin + MVVM 의 형태로 프로젝트를 재 구성하거나, 새로운 프로젝트에서 사용할 예정입니다.









* MVP 패턴 구성


MVP 패턴을 이용하기 위해 아래와 같은 뼈대를 구축하였습니다.

(현재는 인트로(로그인), 회원가입, 메인 화면만 구성된 상태)










제가 이해한 MVP Pattern 입니다.

(사실 MVP가 정확히 이렇게 사용하는 건지는 잘 모르겠습니다..)


우선, 

1. View 는 Data 로 부터 독립적이어야 한다. (View <-> Model)

2. View 는 User의 이벤트만 처리하고, 독단적으로 무엇을 처리하지 않아야 한다. (Presenter -> View 갱신)

3. Data 는 재사용 할 수 있는 형태로 구성되어야 한다. (독립적인 1개의 Model)


의 제약조건을 MVP 패턴이라고 생각했으며, 그 결과 위와 같은 구조가 되었습니다.





이 구조를 로그인을 하는 과정에 적용해보면, 아래와 같은 process 가 그려질 것입니다.



구조에서 보시는 바와 같이, 

View 의 역할은 단 두가지 입니다.


1. User 의 액션을 받아 Presenter 로 전달.

2. Presenter 에서 들어오는 요청에 맞게 View 갱신.


처음에 이해가 되지 않았던 부분이 2번 입니다.


 View 가 완전히 수동적이고 데이터로부터 독립적이라면서, 

어떻게 스스로 UI 를 띄우고 경고창을 노출시키고 하는거지?


결국 로그인 결과값을 받아와서 데이터를 파싱한 후, 

View 가 스스로 UI 를 갱신시켜야 하는거 아닌가?


많이 찾아봤는데, 이해력이 조금 부족한지라 이해하는데 시간이 좀 걸렸습니다. 

(아직도 제가 하는 MVP가 일반적인 MVP 인지 약간의 의구심이 남아있는 상황이오니.. 

MVP 를 새로 배우고자 하시는 분들은 Google MVP 를 참고해 주시기 바랍니다.)





우선, View 는 모든 상황에 대해서 준비를 해 놓고 있는 상태여야 합니다.


위 로그인 과정을 예로 들자면, 

로그인 실패의 경우 Alert 창이 노출되면서 화면에 머무를 거고.

로그인 성공의 경우 다음 화면으로 넘어갈 것입니다.


이 일련의 과정들을 미리 예상하여, View 에 정의해 놓고 Presenter 에서 로그인 여부에 따라 View 의 메소드만 호출하면 되죠.


위 로그인 과정을 코드로 다음과 같이 구현하였습니다.




IntroActivity (View, 유저가 로그인 버튼 터치)

@Override
public void pressedLogin(String id, String pw) {
// Go Login
mPresenter.doLogin(id,
EncryptUtils.passwordEncrypt(pw));
}




■ IntroPresenter (Presneter, View 로 부터 이벤트를 받아 Model 에 로그인 정보 요청)

@Override
public void doLogin(String id, String pw) {
// id pw 공백 확인
if (TextUtils.isEmpty(id)) {
view.popSimpleMessage(mContext.getString(R.string.intro_hint_id));
return;
}

if (TextUtils.isEmpty(pw)) {
view.popSimpleMessage(mContext.getString(R.string.intro_hint_pw));
return;
}


view.showLoading("");

model.doLogin(id, pw,
new ModelCallback<Void>() {
@Override
public void onSuccess(Void result) {
// 로그인 성공
view.hideLoading();
view.goToMain();
}

@Override
public void onFail(Throwable throwable) {
// 로그인 실패
view.hideLoading();
view.popSimpleMessage("로그인 실패.\n\n\n" + throwable.getMessage());
}
});
}

Presenter 는 id 의 유효성을 체크 한 후, 

View 의 로딩을 띄우고, Model 에게 로그인 정보를 요청합니다.



■ Model 

/**
* Repository
*/
public class Model {
private DatabaseModel dbModel = new DatabaseModel();
private NetworkModel netModel = new NetworkModel();

public void doLogin(String id, String pw, ModelCallback<Void> callback) {
netModel.doLogin(id, pw, callback);
}






/*******************
* Inner Class
*******************/


/**
* Data base 에서 긁어오기 위해 선언한 클래스
*/
private class DatabaseModel {

}

/**
* API Server 에서 긁어오기 위해 선언한 클래스
*/
private class NetworkModel {
private void doLogin(String id, String pw, ModelCallback<Void> callback) {
// TODO Delete Test 일단 성공
callback.onSuccess(null);
// ListAPI.api().postLogin(id, pw).enqueue(new Callback<BaseResponse>() {
// @Override
// public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) {
// callback.onSuccess(null);
// }
//
// @Override
// public void onFailure(Call<BaseResponse> call, Throwable t) {
// callback.onFail(t);
// }
// });
}
}
}

모델은 doLogin 요청을 받아, 

네트워크로 연결 후 로그인 결과를 callBack 으로 Presenter 에게 전달합니다.






Project-O Android 는 위와 같이 MVP 구조로 작성할 것이며, 

이 결정이 추후 유지보수에 큰 도움이 되기를 바라며 첫번째 개발일지를 마무리 하겠습니다.





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함