Android Architecture Pattern์ธ MVC, MVP, MVVM์ ๋ํ์ฌ.
Present Time : 2018-06-03-SUN
Presentation File : https://github.com/ParkSohyeon17/TIL/blob/master/Android/MVC%2C%20MVVM%2C%20MVP.pptx
Last Updated : 2018-06-04-MON
์์ ์ฝ๋ ์ถ์ฒ : STEVE.JUNG
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.btn_confirm);
textView.setText("Non-Clicked");
findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TextView textView = (TextView) findViewById(R.id.btn_confirm);
textView.setText(getClickedText());
}
});
}
private String getClickedText() {
return "Clicked!!!";
}
}
Both the Controller and the View depend on the Model: the Controller to update the data, the View to get the data.
- ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์ด๊ธฐ ๊ฐ๋ฐ์ ๋ํ ํต์ฐฐ๋ ฅ ์ค ํ๋์ด๋ค.
- MVC๋ ์ฑ ์๊ณผ ๊ด๋ จํ์ฌ ์ํํธ์จ์ด ๊ตฌ์ฑ์ ์ค๋ช ํ๊ณ ๊ตฌํํ๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋์๋ค.
- Trygve Reenskaug๋ 1970 ๋ ๋์ Xerox Palo Alto Research Center(PARC)๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด์ Smalltalk -76์ MVC๋ฅผ ๋์ ํ๋ค.
-
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋ก์ง์ด ๋น์ฆ๋์ค ๋ก์ง๋ณด๋ค ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝํฅ์ด ์๋ ์ธ๊ณ
-
๊ฐ ๊ณ์ธต์ ๋ถ๋ฆฌ์ํด์ผ๋ก์จ ์ฝ๋์ ์ฌํ์ฉ์ฑ์ ๋์ด๊ณ ๋ถํ์ํ ์ค๋ณต์ ๋ง๊ธฐ์ํด์
- Model : ๋น์ฆ๋์ค ๊ณ์ธต ๊ด๋ฆฌ. ๋คํธ์ํฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค API๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ ๊ณ์ธต
- View : ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ. ์ฆ, UI Layer.
- Controller : Logic Layer์ ์ฌ์ฉ์ ํ๋์ ํต์ง ๋ฐ๊ณ ํ์์ ๋ฐ๋ผ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํจ.
-
Model
- ์ ์์ ๊ฐ๋ค.
-
View
-
๋ทฐ๋ ํ์ ๋ชจ๋ธ์ ๋ํ ์ง์์ด๋ ์ํ์ ๋ํ ์ดํด๊ฐ ์๊ณ , ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋ ๊ฐ์ ์ ๋ ฅํ๋ ๋ฑ์ ํ๋์ ํ ๋ ๋ฌด์์ ํด์ผ ํ๋์ง ๋ชจ๋ฅธ๋ค.
๋ทฐ๊ฐ ๋ ์์๋ก ๋ชจ๋ธ์ ์ข ์๋์ง ์์ผ๋ฏ๋ก ๋ณด๋ค ๋ณํ์ ์ ์ฐํ ์ ์๋ค.
-
-
Controller
-
์ฑ์ ๋ฌถ์ด์ฃผ๋ ์ ์ฐฉ์
-
๋ทฐ๊ฐ ์ปจํธ๋กค๋ฌ์๊ฒ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ ๋ค๊ณ ์๋ฆฌ๋ฉด, ์ปจํธ๋กค๋ฌ๋ ๊ทธ์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ชจ๋ธ๊ณผ ์ํธ์์ฉํ ์ง ๊ฒฐ์ ํ๋ค.
-
๋ชจ๋ธ์์ ๋ฐ์ดํฐ๊ฐ ๋ณํ๋๋ ๊ฒ์ ๋ฐ๋ผ ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์ ์ํ๋ฅผ ์ ์ ํ๊ฒ ์ ๋ฐ์ดํธํ๋๋ก ๊ฒฐ์ ํ ์ ์๋ค.
-
์๋๋ก์ด๋ ์ฑ์์๋ ์ปจํธ๋กค๋ฌ๊ฐ ์ฃผ๋ก ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ๋ก ํํ๋๋ค.
โ
-
-
์ฝ๋์ ํ ์คํธ ๊ฐ๋ฅ์ฑ์ด ํฅ์๋๋ค.
-
ํ์ฅ์ด ์ฉ์ดํ์ฌ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
-
Model ํด๋์ค๋ Android ํด๋์ค์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ผ๋ฏ๋ก ๋จ์ ํ ์คํธ์ ๊ฐ๋ฅํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Controller์ ๋จ์ํ ์คํธ๋ ๊ฐ๋ฅํ๋ค.
โ
-
-๋ชจ๋ธ์ด ์ด๋์๋ ์ข ์๋์ง ์์ผ๋ฉฐ, ๋ทฐ๋ ์ ๋ ํ ์คํธ ๋ ๋ฒจ์์ ๊ทธ๋ค์ง ํ ์คํธํ ๊ฒ์ด ๊ฑฐ์ ์์ด์ ์ฝ๊ฒ ๋ชจ๋ธ์ ํ ์คํธํ ์ ์๋ค. ํ์ฅ์ด ์ฉ์ดํ์ฌ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
โ
-
View๊ฐ Controller์ Model ๋ชจ๋์ ์์กดํ๋ค๋ ์ ์ ๊ฐ์ํ ๋, UI Logic์ ๋ณ๊ฒฝ์ ์ฌ๋ฌ ํด๋์ค์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ์์ผ๋ฏ๋ก ํจํด์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค.
โ
-
View์ Model์ด ์๋ก ์์กด์ ์ด๋ค.
โ
- ํ ์คํธ ์ฉ์ด์ฑ : ์ปจํธ๋กค๋ฌ๊ฐ ์๋๋ก์ด๋ API์ ๊น๊ฒ ์ข ์๋๋ฏ๋ก ์ ๋ ํ ์คํธ๊ฐ ์ด๋ ต์ต๋๋ค.
- ๋ชจ๋ํ ๋ฐ ์ ์ฐ์ฑ : ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ์ ๋จ๋จํ ๊ฒฐํฉ๋๋ฉฐ, ๋ทฐ์ ํ์ฅ์ผ ์๋ ์์ต๋๋ค. ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ปจํธ๋กค๋ฌ๋ก ๋์๊ฐ์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
- ์ ์ง ๋ณด์ : ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณด๋ค ๋ง์ ์ฝ๋๊ฐ ์ปจํธ๋กค๋ฌ๋ก ๋ชจ์ด๋ฉด์ ๋น๋ํด์ง๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์์ง๋๋ค. ํนํ *anemic models ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ์ฑ์์๋ผ๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
*anemic models ?
๋น์ฝํ ๋๋ฉ์ธ ๋ชจ๋ธ. ๋ชจ๋ ๋๋ฉ์ธ ๋ก์ง์ด ์๋น์ค ๊ณ์ธต์ ์๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ์ค์ค๋ก๋ฅผ ์ฅ๋์ผ๋ก ๋ง๋ ๊ฒ์ด๋ ๋ค๋ฆ์๋ค.
public class MainActivity extends AppCompatActivity {
private MainModel mainModel;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainModel = new MainModel();
textView = (TextView) findViewById(R.id.btn_confirm);
textView.setText("Non-Clicked");
findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String text = mainModel.getClickedText();
TextView textView = (TextView) findViewById(R.id.btn_confirm);
textView.setText(mainModel.getClickedText());
}
});
}
}
public class MainModel {
public String getClickedText() {
return "Clicked!!!";
}
}
-
Controller๋ Model์ ์กฐ์ํ๋ ์ ์ผํ ํด๋์ค.
-
์ฌ์ฉ์์ ๋์์ ๋ฐ๋ผ Controller๋ Model์ ์์ ํด์ผ ํ๋ค.
-
Model์ด ์ ๋ฐ์ดํธ ๋ ํ์ Controller๋ View๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํจ์ ์๋ฆฐ๋ค. View๋ Model๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค.
โ
-
Controller๋ Model์ ์์ ํ๋ ์ ์ผํ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ Observer Pattern์ ๋์์ ๋ฐ์ View ๋ฐ ๊ธฐํ ํด๋์ค์ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฆฐ๋ค.
-
Model์๋ ์ ๋ฐ์ดํธ์ ๊ด์ฌ์ด ์๋ Observer ์ปฌ๋ ์ ์ด ํฌํจ๋์ด ์๋ค.
-
View๋ Observer interface๋ฅผ ๊ตฌํํ๊ณ Observer๋ฅผ Model์ ๋ฑ๋กํ๋ค.
-
Model์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค Observer ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ์ฌ update๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. View์์ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด Model์ ์ต์ ๋ฐ์ดํฐ ์์ฒญ์ด ํธ๋ฆฌ๊ฑฐ๋๋ค.
โ
Since the View and the Presenter work closely together, they need to have a reference to one another. To make the Presenter unit testable with JUnit, the View is abstracted and an interface for it used. The relationship between the Presenter and its corresponding View is defined in a
Contract
interface class, making the code more readable and the connection between the two easier to understand.
-
MVC ํจํด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ์ฌ ๋ฑ์ฅํ ํจํด.
-
MVC ํจํด์ ๋ทฐ๊ฐ ๋ชจ๋ธ์ ๊ฐ๋ ฅํ๊ฒ ์์กดํ๋ค. MVP๋ ๊ฐ ์์๋ฅผ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ์ฌ ์ปคํ๋ง์ ๋ฎ์ถ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
โ
-
Model
- MVC์ ๊ฐ๋ค.
-
View
- MVC์ ๊ฐ๋ค.
-
Controller
- ๋ชจ๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์.
- UI๋ก์ง ์ ์ฉ.
- View ์ํ ๊ด๋ฆฌ ๋ฐ ํ์ ํ ํญ๋ชฉ ๊ฒฐ์ .
- View์์ ์ฌ์ฉ์ ์ ๋ ฅ ํต์ง์ ๋ฐ์.
โ
MVP๋ ์ปจํธ๋กค๋ฌ์ ์ฑ ์์ ๋ฌถ์ด์ง ์๊ณ ๋ ๋ทฐ์ ์กํฐ๋นํฐ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๊ฒฐํฉํ๋๋ก ํ๋ค.
-
Presenter์ View์์ ๋ถ๋ฆฌ๋์ด ์๋ค. View๋ฅผ interface๋ฅผ ํตํด ์กฐ์ํ๋ค. ๊ทธ๋์ View๋ฅผ *Mockํ์ฌ ํ ์คํธํ๊ธฐ ์ฝ๋ค.
-
Controller์ View๊ฐ ๋ชจ๋ ๋ชจ๋ธ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
-
Controller๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
-
View๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
โ
-
Model
- MVC์ ๋์ผํ๋ฉฐ ๋ณํ๊ฐ ์๋ค.
-
View
-
๋ณํ : ์กํฐ๋นํฐ/ํ๋๊ทธ๋จผํธ๊ฐ ์ด์ ๋ทฐ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ค์ด ์๋ก์๊ฒ ์ฐ๊ด๋๋ ์์ฐ์ค๋ฌ์ด ํ์์ ๊ทน๋ณตํ ํ์๊ฐ ์๋ค.
-
์กํฐ๋นํฐ๊ฐ ๋ทฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ํ๋ฆฌ์ ํฐ๊ฐ ์ฝ๋๋ฅผ ๋ง๋ค ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
ํน์ ๋ทฐ์ ๊ฒฐํฉ๋์ง ์๊ณ ๊ฐ์ ๋ทฐ๋ฅผ ๊ตฌํํด์ ๊ฐ๋จํ ์ ๋ ํ ์คํธ๋ฅผ ์คํํ ์ ์๋ค.
-
-
Presenter
-
๋ณธ์ง์ ์ผ๋ก๋ MVC์ ์ปจํธ๋กค๋ฌ์ ๊ฐ์ง๋ง, ๋ทฐ์ ์ฐ๊ฒฐ๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๋ฅ ์ธํฐํ์ด์ค๋ผ๋ ์ ์ด ๋ค๋ฅด๋ค.
MVC๊ฐ ๊ฐ์ง ํ ์คํธ ๊ฐ๋ฅ์ฑ ๋ฌธ์ ์ ํจ๊ป ๋ชจ๋ํ/์ ์ฐ์ฑ ๋ฌธ์ ์ญ์ ํด๊ฒฐํฉ๋๋ค.
โ
-
*Mocking ?
- ์ข ์์ฑ์ ์์กดํ์ง ์๊ณ ์ฝ๋ ๋จ์๋ฅผ ํ ์คํธ ํ ์์๊ฒ ํด์ฃผ๋ ํ๋์ ํน์ ๊ธฐ์ ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๋ฉ์๋์ ์ฐจ์ด์ ์ ์ฝ๋ ์์กด์ฑ์ ๋์ฒดํ๋ ๋ชจ์ ๊ฐ์ฒด(Mocking)๊ฐ ๊ธฐ๋์น๋ฅผ ์ค์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ชจ์ ๊ฐ์ฒด(Mocking)๋ ์ฝ๋์ ์ํด ํธ์ถ๋๋ ๋ฐฉ๋ฒ๊ณผ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ์๊ฒ๋๋ค.
-
๋งค์ฐ ํ๋ฅญํ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค.
โ
-
์์ ์ดํ or ํ๋กํ ํ์ ๊ฐ๋ฐ ์, ์ค๋ฒ ํค๋์ฒ๋ผ ๋ณด์ผ ์ ์๋ค. (์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค๊ฐ ๋ง๊ธฐ ๋๋ฌธ์)
-
Presenter๊ฐ ๋ชจ๋ ๊ฒ์ ์๋ ํด๋์ค๊ฐ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ฝ๋๋ฅผ ๋ ๋ง์ด ๋ถํดํ๊ณ , ๋จ์ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
โ
public interface MainPresenter {
void setView(MainPresenter.View view);
void onConfirm();
public interface View {
void setConfirmText(String text);
}
}
public class MainActivity extends AppCompatActivity implements MainPresenter.View{
private MainPresenter mainPresenter;
private Button confirmButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter = new MainPresenterTmpl(MainActivity.this);
mainPresenter.setView(this);
confirmButton = (Button) findViewById(R.id.btn_confirm);
confirmButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainPresenter.onConfirm();
}
});
}
@Override
public void setButtonText(String text) {
confirmButton.setText(text);
}
}
public class MainModel {
public String getClickedText() {
return "Clicked!!!";
}
}
public class MainPresenterTmpl implements MainPresenter {
private Activity activity;
private MainPresenter.View view;
public MainPresenterTmpl(Activity activity) {
this.activity = activity;
this.mainModel = new MainModel();
}
@Override
public void setView(View view) {
this.view = view;
}
@Override
public void onConfirm() {
if(view!=null) {
view.setConfirmText(mainModel.getClickedText());
}
}
}
The MVVM pattern was created to simplify the event drivenprogramming of user interfaces.
: Activity(Fragment)๊ฐ View ์ Controller ๋ ๊ฐ์ง์ ํน์ฑ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ View๋Controller๋ฅผ ํ ์ชฝ์ผ๋ก ๋นผ๊ฒ ๋ ๊ฒฝ์ฐ View์ ๋ํ ๋ฐ์ธ๋ฉ์ด๋ ์ฒ๋ฆฌ์์ ์ค๋ณต ์ฝ๋๋ ์ผ๊ด์ฑ์ ์์ด๋ฒ๋ฆฌ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด์ MVVM ์ด๋ ํจํด์ด ๋ฑ์ฅํ๋ค.
- Model(Data Model)
- ๋ฐ์ดํฐ ์์ค๋ฅผ ์ถ์ํํ๋ค.
- View Model์ Data Model๊ณผ ํจ๊ป ์๋ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ๋ค.
- View
- ์ฌ์ฉ์์ ํ๋์ ๋ํ ๋ทฐ ๋ชจ๋ธ์ ์๋ฆฐ๋ค.
- View Model
- View์ ๊ด๋ จ ๋ฐ์ดํฐ์ ์คํธ๋ฆผ์ ๋ ธ์ถํ๋ค.
์๋๋ก์ด๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ๋ MVVM์ ํ ์คํธ์ ๋ชจ๋ํ๊ฐ ์ฝ๊ณ ๋ทฐ์ ๋ชจ๋ธ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด
์ฌ์ฉํด์ผ ํ๋ ์ฐ๊ฒฐ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
-
ViewModel์๋ View์ ๋ํ ์ ๋ณด๊ฐ ์๋ค.
โ
-
Model
- MVC์ ๋์ผํ๋ฉฐ ๋ณํ๊ฐ ์๋ค.
-
View
- ๋ทฐ๋ ๋ทฐ๋ชจ๋ธ์ ์ํด ๋ณด์ฌ์ง๋ ์ต์ ๋ฒ๋ธ ๋ณ์์ ์ก์ ์ ์ ์ฐํ๊ฒ ๋ฐ์ธ๋ฉ๋๋ค.
-
ViewModel
-
๋ทฐ๋ชจ๋ธ์ ๋ชจ๋ธ์ ๋ํํ๊ณ ๋ทฐ์ ํ์ํ ์ต์ ๋ฒ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ค.
-
๋ทฐ๊ฐ ๋ชจ๋ธ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ์ ์๋๋ก ํ (hook)์ ์ค๋นํ๋ค. ๊ทธ๋ฌ๋ฉด์๋ ๋ทฐ๋ชจ๋ธ์ด ๋ทฐ์ ์ข ์๋์ง๋ ์๋๋ค.
โ
-
- ํ ์คํธ ํ๊ธฐ๊ฐ ์ฝ๋ค.
- UI ์๊ตฌ์ฌํญ์ด ๋ค์ ๋ณ๊ฒฝ๋๋ฉด ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋ค.
-
Activity์ Fragment์ ์ฝ๋๊ฐ ๋ง์์ง์๋ก ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
-
์ค์ฒฉ๋ ์ฝ๋ฐฑ์ด ๋ง์ผ๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๊ณ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
-
Activity์ Fragment์ ๋ง์ ๋ก์ง๋ค์ด ๊ตฌํ๋์ด ์์ด ์ ๋ ํ ์คํ ์ ๊ฐ๋ฅํ์ง๋ง ์ด๋ ต๋ค.
โ
public class MainActivity extends AppCompatActivity {
private MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainViewModel = new MainViewModel(MainActivity.this);
}
}
public class MainModel {
public String getClickedText() {
return "Clicked!!!";
}
}
public class MainViewModel {
private Activity activity;
private MainModel mainModel;
private TextView textView;
public MainViewModel(Activity activity) {
this.activity = activity;
this.mainModel = new MainModel();
initView(activity);
}
private void initView(Activity activity) {
textView = (TextView) activity.findViewById(R.id.btn_confirm);
textView.setText("Non-Clicked");
activity.findViewById(R.id.btn_confirm)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String text = mainModel.getClickedText();
textView.setText(text);
}
});
}
}