์๋
ํ์ธ์ :) ์ค๋์ Android ๊ฐ๋ฐ์์ ์ฌ์ฉ๋๋ MVC ์ํคํ
์ฒ ํจํด์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. Android ๊ฐ๋ฐ ๊ฒฝํ์ด ์์ผ์๋ค๋ฉด, ์์ ๋ก ์ค๋นํ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ดํด๋ฅผ ๋์ฐ์๋ฉด ๋ ์ข์ต๋๋ค. ์์ผ๋ก, MVP, MVVM ์ํคํ
์ฒ๋ ์ ๋ฆฌํด๋ณผ ์์ ์ด๋ ๊ธฐ๋ํด์ฃผ์ธ์. ๊ทธ๋ผ ์ค๋๋ ํ์ดํ
์
๋๋ค ๐ฟ
MVC ์ํคํ
์ฒ๋?
- Model์ ๋ฐ์ดํฐ ๋ก์ง์ ๋ด๋น, ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- View๋ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ด๋น, UI ์ฒ๋ฆฌ ( C๋ก๋ถํฐ ์๋ฆผ์ ๋ฐ๊ณ , ์ด ์๋ฆผ์ M๊ณผ ํจ๊ป UI๋ก ๊ตฌ์ฑ)
- Controller๋ ๋น์ฆ๋์ค๋ก์ง์ ๋ด๋น, ์ฌ์ฉ์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
MVC ์ํคํ
์ฒ ํจํด์ ํ๋ฆ
- Control์ด ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ค.
- Control๋ ์ฌ์ฉ์ ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ์ ์
๋ฐ์ดํธ ์ ๋ฌด๋ฅผ ํ์ธํ๋ค.
- ๋ฐ์ดํฐ ์
๋ฐ์ดํธ yes) Model์ด ๋ฐ์ดํฐ ๊ฐฑ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- Model์ View์๊ฒ ์์ (Model)์ด ์
๋ฐ์ดํธ ๋์๋ค๋ ์ฌ์ค์ ์๋ฆฐ๋ค. (๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋จ๊ณ๊ฐ ์๋์ ์ฃผ์)
- View๋ Model์ด ์
๋ฐ์ดํธ ๋์๋์ง ํ์ธํ๋ค.
- ๋ชจ๋ธ ์
๋ฐ์ดํธ yes) View๋ ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ Model๋ก ๋ถํฐ ๊ฐ์ ธ์ค๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก UI ๊ฐฑ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
Android์์ MVC ์ํคํ
์ฒ๋?
์๋๋ก์ด๋์์ ์ฌ์ฉํ๋ ์ํคํ
์ฒ
MVC : Model/ View/ Controller
MVP : Model/ View/ Presenter
MVVM : Model/ View/ ViewModel
์๋๋ก์ด๋์์์ MVC ์ํคํ
์ฒ ํจํด์ ํ๋ฆ
> Activity/ Fragment๊ฐ View์ Control์ ์ญํ ์ ๋์ ์ํ
- Activity(Control)๊ฐ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ค. : Activity์ Onclicklistener์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์
- Activity(Control)๋ ์ฌ์ฉ์ ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ์ ์
๋ฐ์ดํธ ์ ๋ฌด๋ฅผ ํ์ธํ๋ค.
- ๋ฐ์ดํฐ ์
๋ฐ์ดํธ yes) Model์ด ๋ฐ์ดํฐ ๊ฐฑ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- Model์ Activity(View)๋ก ์์ (Model)์ด ์
๋ฐ์ดํธ ๋์๋ค๋ ์ฌ์ค์ ์๋ฆฐ๋ค.
- Activity(View)๋ Model์ด ์
๋ฐ์ดํธ ๋์๋์ง ํ์ธํ๋ค.
- ๋ชจ๋ธ ์
๋ฐ์ดํธ yes) Activity(View)๋ ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ Model๋ก ๋ถํฐ ๊ฐ์ ธ์ค๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก UI ๊ฐฑ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
MVC ์ํคํ
์ฒ ์์
MainActiviy.kt
package com.example.mvc
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
lateinit var model: Model
private lateinit var textView: TextView
private lateinit var button: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById<TextView>(R.id.textView)
button = findViewById<Button>(R.id.button)
textView.setTextColor(ContextCompat.getColor(this,R.color.black))
var selected = false
model = Model()
textView.text = model.unselectedString
button.text = model.unselectedString
button.setOnClickListener {
selected = !selected
textView.text = if (selected) model.selectedString else model.unselectedString
button.text = if (selected) model.selectedString else model.unselectedString
}
}
}
Model.kt
package com.example.mvc
class Model {
val selectedString = "Selected"
val unselectedString = "Unselected"
}
xml๋ฅผ ํฌํจํ ์๋ณธ ์ฝ๋๋ ์ ์ Github์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
MVC ์ํคํ
์ฒ์ ์ฅ์
- ์๊ฐํ ๋ถ๋ถ์ด ๋ง์ง ์์, ๊ฐ๋ฐ ๊ธฐ๊ฐ์ด ์งง์ ์ ์๋ค
- ์ฝ๋ ์์ฒด๋ฅผ ํ์
ํ๋ ๊ฒ์ด ์ด๋ ต์ง ์๋ค.
MVC ์ํคํ
์ฒ์ ๋จ์
- ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค.
- ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ๋ง์์ง๋ค.
- ๋ณต๋ถ์ด ๋ง์์ ธ ์ ์ฒด์ ์ธ ์ฝ๋ ์์ด ์ฆ๊ฐํ๋ค.
- ์คํ๊ฒํฐ ์ฝ๋๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ง์์ง๋ค.
- ํจ์ ๋ถ๋ฆฌ ๋ฐ ํด๋์ค ๋ถ๋ฆฌ๊ฐ ์ ์ ํ๊ฒ ์ด๋ค์ง์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ํ ํด๋์ค์์ 3๊ฐ์ ์ญํ ์ ๋์์ด ์ด๋ค์ง ์ ์์ด, ํ ํด๋์ค์ ์ฝ๋๊ฐ ๋งค์ฐ ๋ฐฉ๋ํด์ง ์ ์๋ค.
- ํ ํด๋์ค์ ์ฝ๋ ์์ด ๋ง์์ง๋ค.
- ํ
์คํธ ์ฝ๋ ์์ฑ์ด ์ด๋ ต๋ค.
- ๋๋ถ๋ถ์ ์ฒ๋ฆฌ๊ฐ UI์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, UI ์์ฃผ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค.
- Model๊ณผ View์ ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค.
- ๋๋ถ๋ถ์ ์ฝ๋๋ฅผ View์์ Model์ ์ง์ ํธ์ถํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ ํผ๋ฐ์ค
์ง์๋คํ
taehwandev/AndroidMVPSample
https://www.youtube.com/watch?v=KCDCElsFZ38