Recent Posts
Recent Comments
«   2024/05   »
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 31
관리 메뉴

Dev.

MVP (Model, VIew, Presenter) Pattern 의 기본 예 본문

Pattern

MVP (Model, VIew, Presenter) Pattern 의 기본 예

Pppdw 2018. 6. 5. 15:50

일단,


https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/

위 문서를 한번이라도 참조하고.


https://github.com/googlesamples/android-architecture

위 문서의 코드를 참조 한 뒤 기본적인 이해가 잡히면 아래의 글을 읽을 필요가 없다.



mvp 패턴은 개발자라면 한번씩은 다들 들어봤을 패턴이다.


기존의 (라고 하기엔 애매하다. 애초에 mvc의 후속 패턴이 mvp 가 아니다. 둘은 성격이 다르다.) mvc에서 정말 문제되었던 포인트가 종속의 애매함이었다. 


(특히 뷰와 컨트롤러의 개념이 정확히 나눌수 없는 안드로이드 개발 에서는 정말 생각없이 mvc패턴을 구현하다간 지옥을 맛 볼수 있다.)


기본적인 의미 정의는 같다.


1. model 은 데이터와 그 관리 상태를 의미하며,


2. view 는 모델의 표현을 의미하나, mvp 패턴의 view는 mvc의 view와 조금 다르게 activity와 fragment를 view 의 일부로 간주한다.


3. presenter 는 view 와 1:1로 의존하게 되며 mvc 의 controller 개념 정도로 파악하면 될 것 같다.


위 의 2번 문제로 인해 mvvm(model, view, viewmodel) 이라는 새로운 해결책이 안드로이드 에서 사용되고 있고,

마찬가지로 mvp 패턴에 dagger2 혹은 rxjava2를 이용하여 의존성을 조금이나마 끊은 패턴도 존재한다.


위의 문제가 존재한다고 쳐도 mvp는 그 자체로 훌륭한 패턴이며, tdd 에 있어 mvp보다 뛰어난 개발 패턴은 없다고 개인적으로 생각한다.


이런 글을 남기게 된 이유도, 

몇년 전 mvp를 접할때 어디에도 mvp 패턴에 대한 장황한 설명과 방대만 소스코드만 있을 뿐 정말 내가 보고싶은 심플 스타일은 존재하지 않았다.


난 멍청해서 먼저 구현해보고 글을 봐야 이해가 되는 스타일인데, 뭐 참조할게 없었으니...  나같은 문제를 겪는 사람이 분명 있을거라고 생각하고 글을쓰며, 자세한 설명은 차라리 구글의 mvp-master를 참조 하길..




class Impl {
interface Presenter {
void loadData();
void createModel();
}

interface View {
void completed(String data);
}
}


class View implements Impl.View {

Presenter presenter;

public View (){
presenter = new Presenter(this);
presenter.createModel();
presenter.loadData();
}

@Override
public void completed(String data){
System.out.print(data);
}
}


class Presenter implements Impl.Presenter{

private Impl.View view;
private Model model;

public Presenter(Impl.View view){
this.view = view;
}

@Override
public void createModel(){
model = new Model();
}

@Override
public void loadData() {
if(model == null){
System.out.print("model is null");
return;
}

view.completed(model.getName());
}
}

class Model {
private String name = "kim";
public String getName(){
return name;
}
}




정말로 위의 코드패턴이 끝이다..


단순히 말해 View 는 Presenter 에게 데이터 수집 명령 및 내가 해야될 행동지시를 받으며, 필요한 정보를 요청하고

그 에 따른 Presenter의 callback에 맞추어 움직인다. (정말 기본적으론, 심화 패턴을 구현하기 위한 수준이라면 위의 코드를 볼 필요가 없다.)


Presenter 는 View 의 요청을 받고 오더를 전달하며 데이터 수집, 비즈니스 로직을 수행하고


Model 은 말그대로 데이터를 담당한다.


정말 간략하게 설명하면 위의 description 이 전부이다.


물론 mvp 패턴에서 금기되어야 할 항목, 즉 model 을 view가 가지고 있는다던가 하는 행위는 금지되어 있지만,


최상단 realm의 패턴 설명도를 본다면 확실히 개념이 잡힐 것 이다.


이 포스트는 정말 mvp 패턴을 그나마 적용한 최소한의 껍데기만 표현할 목적의 예제이다.


Comments