일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Transaction isolation level
- 암호화
- JPA 동시성
- flask
- bean
- spring security 인증
- JPA 비관적락
- 스프링 로그
- 낙관적락 비관적락 차이
- 서버개발캠프
- 스프링 log
- spring security
- annotation
- Android
- component
- Inno DB
- JPA Lock
- Optimistic Lock
- 서버
- JPA 낙관적락
- Redis
- JPA
- 안드로이드
- 스마일게이트
- Pessimistic Lock
- 디자인 패턴
- 캠프
- 개발
- spring
- 스프링
- Today
- Total
모르는게 많은 개발자
[안드로이드] MVC, MVP 차이와 간단한 MVP 예제 본문
여러 안드로이드 프로젝트를 진행해보면서 디자인 패턴에 대해 고려해보지 않았다. 하지만 팀프로젝트에서 협업을 위해서는 이해하기 쉬운 코드를 작성하는게 필수라는 것을 깨닫고, 디자인 패턴에 대해 공부해야겠다 생각했다. 그래서 안드로이드 프로젝트의 패턴에는 뭐가 있나 알아보았다.
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 안드로이드 예제
-
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
'안드로이드' 카테고리의 다른 글
[안드로이드] RecylcerView - Kotlin 간단 예제 (0) | 2020.05.04 |
---|---|
[안드로이드] Retrofit2 간단 예제 (0) | 2020.04.09 |
[안드로이드] 생명 주기 (0) | 2020.03.28 |