[์ํคํ ์ฒ] MVC, MVP, MVVM, MVI ํจํด์ ๊ดํ์ฌ
๐ 1. MVC
Model, View, Controller์ ์ฝ์๋ก, ์๋๋ก์ด๋์ ๊ด๊ณ์์ด ํ๋ก๊ทธ๋๋ฐ ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋์์ธ ํจํด(๊ตฌ์กฐ)์ ๋๋ค.
1. User(์ ์ )๊ฐ Controller(์ปจํธ๋กค๋ฌ)๋ฅผ ํตํด ์ ๋ ฅํ๋ค.
2. Controller๋ Model(๋ชจ๋ธ)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์์ , ์ญ์ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ค.
3. Controller๋ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์, View(๋ทฐ)์ ์ ๋ฌํ๋ค.
4. ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ View์ ๊ทธ๋ ค, User๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณธ๋ค.
Model ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ค. |
|
View ์ ์ ์ ๋ณด์ผ ํ๋ฉด์ ํํํ๋ฉฐ, ์ด๋ค ๋ฐ์ดํฐ๋ ๋ก์ง์ด ์์ด์๋ ์๋๋ค. |
Activity, Fragment = View, Controller ์ญํ |
Controller Model๊ณผ View๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, ์ ์ ์ ์ ๋ ฅ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ค. |
1-1. MVC ์ฅ๋จ์
์ฅ์ | ๋จ์ |
๊ตฌํ ์ฝ๊ณ ๋จ์ | Controller์ ๋ง์ ์ฝ๋ |
๊ฐ๋ฐ ๊ธฐ๊ฐ ๋จ์ถ | ์ ์ง๋ณด์ ์ด๋ ค์ |
Model - View ๋ถ๋ฆฌ | Model - View ๊ฒฐํฉ๋ ์์น |
Model์ด ์ข ์๋์ง ์์, ์ฌ์ฌ์ฉ ๊ฐ๋ฅ | ํ ์คํธ์ฝ๋ ์์ฑ ์ด๋ ค์ |
MVC ํจํด์ ์๋๋ก์ด๋ ๊ฐ๋ฐ ์ด๊ธฐ ๋ง์ด ์ฌ์ฉ๋์์ง๋ง,
ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ผ๋ก ์ธํด ํ์ฌ์๋ ๋ง์ด ์ฌ์ฉ๋์ง ์๋ ํจํด์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ท๋ชจ๊ฐ ์๊ณ ๋น ๋ฅธ ๊ฐ๋ฐ์ฃผ๊ธฐ๋ก ์งํ๋์ด์ผ ํ๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ MVC ํจํด์ด ์ ํฉํฉ๋๋ค.
๐พ 2. MVP
Model, View, Presenter์ ์ฝ์๋ก, MVC ํจํด์ View์ Model์ ์์กด์ฑ์ ์์ ๊ณ ,
๋จ์ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ํจํด์ ๋๋ค.
1. User(์ ์ )๊ฐ View(๋ทฐ)๋ฅผ ํตํด ์ ๋ ฅํ๋ค.
2. View๋ Presenter(ํ๋ฆฌ์ ํฐ)์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ค.
3. Presenter๋ Model(๋ชจ๋ธ)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์์ , ์ญ์ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ค.
4. Presenter๋ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์, Interface๋ฅผ ํตํด View์ ์ ๋ฌํ๋ค.
5. ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ View์ ๊ทธ๋ ค, User๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณธ๋ค.
์ฌ๊ธฐ์์ Model๊ณผ View์ ์ญํ ์ MVC์ ๋น์ทํ์ง๋ง, Controller ๋์ ํ์ฌ Presenter๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค.
Model ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ข ์์ ์ด์ง ์์, ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. Network API, ๋ฐ์ดํฐ ์บ์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค(, Repository) ๋ฑ์ด ํฌํจ๋๋ค. |
View ์ ์ ์๊ฒ ๋ณด์ผ ํ๋ฉด์ ํํํ๋ฉฐ, Model๋ก๋ถํฐ ์ป์ ๋ฐ์ดํฐ๋ฅผ View์์ ๋ณด์ฌ์ค๋ค. Activity, Fragment ๋ฑ์ด ํฌํจ๋๋ค. ์ค์ง Presenter๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์, Presenter์ ์์กด์ ์ด๋ค. |
Presenter Model๊ณผ View ์ฌ์ด์ ์ค๊ฐ์ ์ญํ ์ ๋ด๋นํ๋ฉฐ, View์์ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ Model์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ View์ ๊ทธ๋๋ก ์ ๋ฌํ๋ค. |
2-1. MVP์ ์ฅ๋จ์
์ฅ์ | ๋จ์ |
Model - View ๊ฐ ์์กด์ฑ ์์ | View์ Presenter๊ฐ 1:1 ๊ด๊ณ |
UI์ ๋น์ฆ๋์ค ๋ก์ง ๋ถ๋ฆฌ | View๊ฐ ๋ง์์ง๋ฉด, Presenter๋ ๋ง์์ง |
๋จ์ ํ ์คํธ ์ฉ์ด | ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ์๋ก Presenter ๋น๋ํด์ง |
๐ 3. MVVM
Model, View, ViewModel์ ์ฝ์๋ก,
MVP ํจํด์์ View์ Presenter๊ฐ 1:1๋ก ๋งค์นญ๋์ด์ผ ํ๋ค(๊ฐํ ๊ฒฐํฉ)๋ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ๋์์ธ ํจํด์ ๋๋ค.
1. User(์ ์ )๊ฐ View(๋ทฐ)๋ฅผ ํตํด ์ ๋ ฅํ๋ค.
2. View๋ ViewModel(๋ทฐ๋ชจ๋ธ)์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ค.
3. ViewModel์ Model(๋ชจ๋ธ)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์์ , ์ญ์ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฌ์จ๋ค.
4. View๋ ViewModel ๊ด์ฐฐํ๊ณ ์๋ค.
5. ViewModel์์ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ LiveData์ ๋ฃ๋๋ค.
6. ViewModel์ ๊ด์ฐฐํ๋ View๋ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค.
MVVM ํจํด์์๋ DataBinding๊ณผ LiveData๋ฅผ ํตํด View์ ViewModel ์ฌ์ด์ ๊ฒฐํฉ์ ๋์ ์ ์์ต๋๋ค.
Model ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ข ์์ ์ด์ง ์์, ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. Network API, ๋ฐ์ดํฐ ์บ์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค(, Repository) ๋ฑ์ด ํฌํจ๋๋ค. |
View ์ ์ ์๊ฒ ๋ณด์ผ ํ๋ฉด์ ํํํ๋ฉฐ, Model๋ก๋ถํฐ ์ป์ ๋ฐ์ดํฐ๋ฅผ View์์ ๋ณด์ฌ์ค๋ค. Activity, Fragment ๋ฑ์ด ํฌํจ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ์ฌ UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค. (๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ์์์ฐจ๋ ค, ์๋์ผ๋ก ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค.) |
ViewModel Model๊ณผ ์ํธ์์ฉํ๋ฉฐ, View์ ์ข ์์ ์ด์ง ์์ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๋ํ๋ธ๋ค. ๊ฐ์ ViewModel์ ๋ค๋ฅธ View์์๋ ์ฌ์ฌ์ฉํ ์ ์๋ค. |
3-1. MVVM์ ์ฅ๋จ์
์ฅ์ | ๋จ์ |
View๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ด์ฐฐ | ๋ค๋ฅธ ๋์์ธ ํจํด์ ๋นํด ๋ณต์ก |
View - ViewModel์ ๋ฎ์ ๊ฒฐํฉ๋ | DataBinding, LiveData ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ํ์ต ํ์ |
์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ์งํ๋ LiveData๋ฅผ ํตํด ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ์ฉ์ด | |
*ํ ๋ฐฉํฅ์ผ๋ก๋ง ์์กด ๊ด๊ณ๊ฐ ์์ด, ๋ชจ๋๋ณ ๋ถ๋ฆฌ ๊ฐ๋ฐ ๊ฐ๋ฅ | |
๋จ์ ํ ์คํธ ์ฉ์ด |
*View๋ ViewModel์ ์์ง๋ง, ViewModel์ View๋ฅผ ์์ง ๋ชปํ๋ค. ViewModel์ Model์ ์์ง๋ง, Model์ ViewModel์ ์์ง ๋ชปํ๋ค.
๐ฑ 4. MVI ํจํด
Model, View, Intent์ ์ฝ์๋ก, MVVM ํจํด์์ *์ํ ๋ฌธ์ , ๋ถ์ ํจ๊ณผ๋ผ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ๋์์ธ ํจํด์ ๋๋ค.
*์ํ ๋ฌธ์ (์ฌ๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ํ๊ฐ ์๋ํ์ง ์์ ๋ฐฉํฅ์ผ๋ก ํ๋ฌํ๋ ๊ฒฝ์ฐ), ๋ถ์ ํจ๊ณผ(์๋์ ๋ชฉ์ ๊ณผ ๋ค๋ฅด๊ฒ, ๋ค๋ฅธ ํจ๊ณผ๊ฐ ๋ํ๋๋ ์ํ)
์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด Javascript์ Redux๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ, MVI๊ฐ ๋ฑ์ฅํ๊ฒ ๋์์ต๋๋ค.
MVI ํจํด์์์ Intent๋ ์ฌ์ฉ์์ ๋์์ ์๋ฏธํ๋ฉฐ,
์ด ๋์์ด Model ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ์ํ๋ ๋ค์ View์ ๋ฐ์๋์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ ๋๋ค.
์ด ๊ณผ์ ์ Redux์ "Action"์ด "State"๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ณ๊ฒฝ๋ "State"๊ฐ ๋ค์ UI์ ๋ฐ์๋๋ ๊ณผ์ ๊ณผ ์ ์ฌํฉ๋๋ค.
๋ฐ๋ผ์ ์ํ ๊ด๋ฆฌ๊ฐ ์ค์ํ๊ณ , ํนํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ๋ณต์กํ๊ณ ์ํธ์์ฉ์ด ๋ง์ ๊ฒฝ์ฐ,
MVI ํจํด์ ์ ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ณํ๋ฅผ ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋จ๋ฐฉํฅ (์ ์ํ) ๊ตฌ์กฐ์ ํ๋ฆ
1. User(์ ์ )๊ฐ Intent(์ธํ ํฐ)๋ฅผ ํตํด Model(๋ชจ๋ธ)์ ์ํ๋ฅผ ์ ๋ฌํ๋ค.
2. Model์ ์ ๋ฌ๋ฐ์ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ์ํ๋ฅผ View(๋ทฐ)์ ์ ๋ฌํ๋ค.
3. View๋ Model๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ํ์ ๋ง๋ ํ๋ฉด์ User์ ๋ณด์ฌ์ค๋ค.
Model ์ ์ผํ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ๋ถ๋ณ ๊ฐ์ฒด ๋ฐ์ดํฐ ๋ก๋ฉ์ด๋ ๋ก๋ ๋ฐ์ดํฐ ์๋ฌ ๋ฑ ๋ค์ํ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค. (์ํ์ ๋ํด View๊ฐ ์ด๋ค ๊ฒ์ ํ๋ฉด์ ๋ ๋๋งํด์ผ ํ ์ง ์๋ ค์ฃผ๋ ์๋ต) |
View ์ ์ ์๊ฒ ๋ณด์ผ ํ๋ฉด์ ํํํ๋ฉฐ, Model๋ก๋ถํฐ ์ป์ ์ํ๋ฅผ View์์ ๋ณด์ฌ์ค๋ค. |
Intent ์ฑ ๋ด์์ ๋ฐ์ํ๋ Action, ์ฑ ๋ด์ ์ํ๋ฅผ ๋ฐ๊พธ๋ ค๋ ํ๋ Model์๊ฒ ์ฑ์ ์ํ๋ฅผ ์ ๋ฌํ๋ค. (User๋ ๋ชจ๋ UI ๋ณํ์ ๋ํด Intent๋ฅผ ํตํด ์ด๋ฒคํธ๋ก ์ ๋ฌํ๋ค.) |
SideEffects ์ํ ๋ณ๊ฒฝ์ด ํ์ ์๋ API, DB ์ ๊ทผ ๋ฑ์ ์ด๋ฒคํธ (์ : ํ ์คํธ ํ์ ๋ฑ) |
4-1. MVI์ ์ฅ๋จ์
์ฅ์ | ๋จ์ |
ํ๋์ ์ํ๋ง ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ํ ์ถฉ๋์ด ์์ | ๋ค๋ฅธ ํจํด์ ๋นํด ๋ฌ๋์ปค๋ธ๊ฐ ๋์ |
์ ์ํ(๋จ๋ฐฉํฅ) ๊ตฌ์กฐ (๋๋ฒ๊น ์ฉ์ด, ๋ก์ง ์์ธก ์ฉ์ด) | ์์ ๋ณ๊ฒฝ์๋ Intent๋ฅผ ๊ฑฐ์ณ์ผ ํจ |
๋ถ๋ณ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ์ค๋ ๋ ์์ ์ฑ ๋ณด์ฅ | ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋ ๋ฐ์ |
๊ฐ์ ์ฑ ์์ผ๋ก ๊ฒฐํฉ๋ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ํ์ (Intent, SideEffects ๋ฑ ๋ชจ๋ ์ํ์ ๊ฐ์ฒด ์์ฑ) |
์ฌ์ง ์ถ์ฒ : 35๊ฐ ํ๋ก์ ํธ๋ก ๋ฐฐ์ฐ๋ Android ์ฑ ๊ฐ๋ฐ feat. Jetpack Compose ์ด๊ฒฉ์ฐจ ํจํค์ง Online. Part3-Ch04