모르는게 많은 개발자

[안드로이드] MVC, MVP 차이와 간단한 MVP 예제 본문

안드로이드

[안드로이드] MVC, MVP 차이와 간단한 MVP 예제

Awdsd 2020. 3. 29. 23:55
반응형

여러 안드로이드 프로젝트를 진행해보면서 디자인 패턴에 대해 고려해보지 않았다. 하지만 팀프로젝트에서 협업을 위해서는 이해하기 쉬운 코드를 작성하는게 필수라는 것을 깨닫고, 디자인 패턴에 대해 공부해야겠다 생각했다. 그래서 안드로이드 프로젝트의 패턴에는 뭐가 있나 알아보았다.

 

1. MVC

웹 프레임에서 가장 많이 대중?적인 패턴이다.

안드로이드가 처음 나왔을때도 개발자들이 안드로이드를 MVC에 적용시키려고 했다고 한다.

 

MVC를 간단히 설명하면

Model : 데이터 관리

View : 유저에게 보여주는 화면

Controller : 사용자의 요청을 인식하여 Model에서 요청에 맞는 데이터를 가져오고  View에 적용 

 

 

안드로이드에서의  MVC

 

안드로이드에서 MVC를 매칭시켜보면

View : Activty(View, Fragment)

Controller : Activity(Button.setOnClickListener)

Model : Model

 

View와 Controller 모두 Activity에서 처리할 수 있다는 것을 알 수 있다.

당연히 View와 Controller가 하나의 클래스에서 이루어지기 때문에 길이가 길어지고, 잘못하면 스파게티 코드가 되기 쉽다.

그래서 대안으로 나온게 MVP패턴이다.

 

2. MVP

MVC의 MV는 같지만 Controller대신 Presenter가 들어간 것이 MVP패턴이다.

Presenter : Contrller와 역할이 비슷하지만 Interface를 사용한다는 것의 차이가 있다. View에서 전달된 이벤트에 따라 Model에서 데이터 요청후 전달하는 중간 역할 담당.

 

 

3. MVP 안드로이드 예제

프로젝트 구조
MainActivty.xml 화면 구성

  • Presenter

//Contract Interface
//View와 Presenter를 연결하기 위한 Interface
package com.example.mvp.Presenter;

public interface Contract {
    interface View{
        void showResult(int answer);      //값을 보여줄 View 메소드 선언
    }
    interface Presenter{
        void addNum(int num1, int num2);  //결과 값 구하기 위한 메소드 선언
    }
}
//MainPresenter class
//Model과 View를 연결하여 동작을 처리해
package com.example.mvp.Presenter;

import com.example.mvp.Model.MainModel;

//Presenter줌
public class MainPresenter implements Contract.Presenter {
    Contract.View view;
    MainModel mainModel;
    public MainPresenter(Contract.View view){
        this.view = view;                   //Activty View정보 가져와 통신
        mainModel = new MainModel(this);    //Model 객체 생성
    }
    
    //Presenter를 상속하고 addNum 구현
    @Override
    public void addNum(int num1, int num2) {
        view.showResult(num1 + num2);
    }
}

 

  • View

//MainActivity class
package com.example.mvp.View;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.mvp.Presenter.Contract;
import com.example.mvp.Presenter.MainPresenter;
import com.example.mvp.R;

//View
public class MainActivity extends AppCompatActivity implements Contract.View {
    private EditText number1;		//입력할 EditText
    private EditText number2;		//입력할 EditText
    private Button sumButton;
    private Contract.Presenter presenter;	//presenter와 통신하기 위해 객체 생성
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter = new MainPresenter(this);
        init();
    }

    private void init(){
        sumButton = (Button)findViewById(R.id.sum);
        number1 = (EditText)findViewById(R.id.number1);
        number2 = (EditText)findViewById(R.id.number2);
        
        //버튼 클릭
        sumButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            	//결과 값 계산
                presenter.addNum(Integer.parseInt(number1.getText().toString()),
                        Integer.parseInt(number2.getText().toString()));
            }
        });
    }
    @Override
    public void showResult(int answer) {
        ((TextView)findViewById(R.id.result)).setText(Integer.toString(answer));
    }
}

 

  • Model

//MainModel class
//데이터 관리를 해줄 클래스
package com.example.mvp.Model;

import com.example.mvp.Presenter.Contract;

//Model
public class MainModel {
    Contract.Presenter presenter;
    public MainModel(Contract.Presenter presenter){
        this.presenter = presenter;
    }
    public saveData(int data){
    	//처리 로직
    }
}

 

 

예제  프로젝트 GitHub

https://github.com/CJW23/Android_MVP_Example

반응형
Comments