티스토리 뷰
업무 시간 외에 개인 시간을 투자하여 프로젝트 개발에 착수했습니다.
개발 일지를 작성하여 개발했던 기록들을 남겨놓으려 합니다.
* 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
- 서버
- BBC 가쉽
- 손석희
- Android
- 뉴스룸
- 앵커브리핑
- Swift
- 노드
- linux
- nodejs
- CentOS
- Kotlin
- C
- node.js
- 스위프트
- 점유율
- 배열
- php
- git hub
- 안드로이드
- xcode
- GIT
- Phaser
- IOS
- C언어
- Asterisk
- mysql
- 리눅스
- Node
- 깃헙
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |