์ค๋์ ์ดํ๋ฆฌ์ผ์ด์ ์ํคํ ์ณ๋ฅผ ์ค๊ณํ ๋ ์ฐ์ด๋ MVC, MVP, MVVM ๋ฑ์ ์ฌ๋ฌ๊ฐ์ง ํจํด์ ๋ํด์ ์ด๋ ํ ๋ฐฐ๊ฒฝ์์ ์ด๋ฌํ ์ํคํ ์ณ๊ฐ ๋์๊ณ ์ด๋ ํ ์๋ฆฌ๋ก ์๋ํ๋์ง ๊น๊ฒ ์ดํดํด๋ณด๋ ์๊ฐ์ ๊ฐ์ง๋ ค๊ณ ํ๋ค.
MVC ํจํด
๊ฐ์ฅ ๋จผ์ , ๋ชจ๋ ๊ฒ์ ์์กฐ๊ฐ ๋๋ MVC ํจํด๋ถํฐ ์ดํด๋ณด๋ ค๊ณ ํ๋ค. Model-View-Controller์ ์ฝ์๋ก, ์ํํธ์จ์ด ์ค๊ณ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธ ๊ฐ์ง ์ฃผ์ ์ญํ ๋ก ๋ถ๋ฆฌํ์ฌ ๊ตฌ์ฑํ๋ ์ํคํ ์ฒ ํจํด์ด๋ค.
- Model(๋ชจ๋ธ) : ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ, ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ํต์ ํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ, ์ฒ๋ฆฌํ๋ ์ญํ
- View(๋ทฐ) : ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ํ๋ฉด(UI)์ ๋ด๋น. Model์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ์ง๋ง, ์ง์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง๋ ์์.
- Controller(์ปจํธ๋กค๋ฌ) : View์ Model ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ค์ฌ์ ์ญํ . ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ์ ๋ฐ๋ผ Model์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ View๋ฅผ ๋ณ๊ฒฝ.
๋ทฐ์์ ์๋ก์ด ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด, ์ด๋ฅผ ์ปจํธ๋กค๋ฌ์ ์๋ฆฌ๊ณ , ์ปจํธ๋กค๋ฌ๋ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ๋ค.
๋ชจ๋ธ์ด ์ ๋ฐ์ดํธ ๋๋ฉด, ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ์๋ก๊ณ ์น๋ผ๊ณ ์ง์ํ๋ค.
์๋๋ ๋ด๊ฐ ์ค์ ๋ก ๊ตฌํํ๋ JS ์ฝ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์์ด๋ค. View ์์ ์ฌ์ฉ์๋ก๋ถํฐ ๊ธ์ก์ ์ ๋ ฅ๋ฐ๊ณ ,
์ปจํธ๋กค๋ฌ๊ฐ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋ชจ๋ธ์ ์ ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View ์ ์ ๋ฌํ์ฌ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ๊น๋ํ๊ฒ MVC ํจํด์ด ์ ๋ถ๋ฆฌ๋ ์ฌ๋ก์ด๋ค.
async handleBuyLottos() {
const money = await InputView.readMoney();
this.#customer = new Customer(money);
this.#customer.buyLottos();
OutputView.printLottos(this.#customer.getLottos());
}
์ฅ์
- ์ญํ ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋์ ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ด ์ข์์ง๋ค.
- ๊ฐ๋ฐ์๊ฐ Model, View, Controller๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์์ด ํ์ ์ ์ฉ์ดํ๋ค.
- ํ๋์ ๋ณํ๊ฐ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ์ฌ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๊ณ , ์์ง๋๋ ๋์ธ๋ค.
=> ์ฝ๋์ ์ฑ
์์ด ๋ช
ํํ๊ฒ ๋ถ๋ฆฌ๋์ด, ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ๋, ํ
์คํธ๋ฅผ ์์ฑํ ๋, ๋ค๋ฅธ ์ฌ๋๊ณผ ํ์
ํ ๋
ํจ์ฌ ์์ํด์ง๋ค. ํนํ View์ Model์ ๋
๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ด, ํ์ชฝ์ ์์ ํด๋ ๋ค๋ฅธ ์ชฝ์ ๋ฏธ์น๋ ์ํฅ์ด ์ ์ด์ง๋ค.
๋จ์
- ์ฑ์ด ์ปค์ง์๋ก ์ปจํธ๋กค๋ฌ๊ฐ ๋น๋ํด์ง ์ ์๋ค.
- ์ด๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ก์ ๋ ๋ง์ ์ค๊ณ ๊ณ ๋ฏผ ํ์ -> ์์ ๊ท๋ชจ์ ํ๋ก์ ํธ์์๋ ์คํ๋ ค ๋ณต์ก๋๋ฅผ ๋์ด๊ฑฐ๋ ์ด๊ธฐ ๊ตฌํ ๋น์ฉ์ ๋์
๋ฆฌ์กํธ์์ MVC ํจํด์ ์ฌ์ฉํ ์ ์์๊น?
FE ์์ View ๋ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ, ํ๋ฉด์ ํ ๋ฐ ๋ณ๊ฒฝ, ์ค์ผ์ฅด, ์๋ฒํต์ ๋ฑ ์จ๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๊ณต๊ฐ์ด๋ค.
๋ฐ๋ผ์, View ๊ฐ ๋ฉ์ธ์ด์ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ ์ ๋ฐ์ ์๋ค.
๋ง์ฝ Vanila JS ๋ฅผ ํตํด MVC ํจํด์ผ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ตฌํํ๊ณ ์ ํ๋ค๋ฉด,
1. View ์ ๋ณ๊ฒฝ์ผ๋ก Model์ ๋ฐ๊พธ์ด์ผํ๊ณ ex) ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ
2. Model ์ ๋ณ๊ฒฝ์ผ๋ก View๋ฅผ ๋ฐ๊พธ์ด์ผํ๋ค. ex) ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ
3. View ๋ ์์ฃผ ๋ง๊ณ , Model ๋ ๋ง์์ ๋ค๋๋ค ๋ง์ ์์กด ๊ด๊ณ๊ฐ ํ์ฑ๋ ์ ์๋ค.
๊ทธ๋ฌ๋, ์ด๋ ๊ฒ ๋๋ฉด ๋ช๊ฐ์ง ๋ฌธ์ ์ ๋ค์ด ์๊ธฐ๋๋ฐ
1. ์์กด์ฑ์ด ๋์์ง๊ณ , ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ํ๋ก๊ทธ๋จ์ ๋ณต์ก๋๋ฅผ ์๋นํ ๋์ธ๋ค.
2. ์ปจํธ๋กค๋ฌ๊ฐ ๊ต์ฅํ ๋น๋ํด์ง๋ค.
3. View์ Controller ๊ฐ์ ์๋ฐฉํฅ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ์ ์์ด ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ณต์กํ ๋ทฐ์ ๋ชจ๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ๋จ์ํํ๊ณ ,
View๋ ์ฆ์ re-rendering ์ผ๋ก ๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ํตํด ๋ ๋๋ง ํจ์จ์ฑ์ ์ป์ด์ผํ๋ค.
MVP (Model-View-Presenter) ํจํด
MVC ํจํด์ ๋ฐ์ ์์ผ View์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฒฐํฉ์ ๋ ๊ฐํ๊ฒ ๋ถ๋ฆฌํ ๊ตฌ์กฐ์ด๋ค.
UI ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋์ ๋๋ Presenter ๋ฅผ ๋์ ํ๋ค.
- Model: ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง
- View: ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ด๋นํ๋ฉฐ, ์ค์ง Presenter์ ์์ฒญ๋ง
- Presenter: View์ Model ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ค๊ฐ ๋งค๊ฐ์ฒด.
View์ ์ ๋ ฅ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ , Model์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ View์ ๋๊น
๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ display์ฉ์ผ๋ก ๋ณํํ๊ณ , ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , ๋ชจ๋ธ๊ณผ ๋ทฐ ์ ๋ฐ์ดํธ๋ฅผ ์กฐ์ ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด, Presenter ๊ฐ UI ๋์์ ๊ตฌ๋ํ๋ ๋์, View ๋ ํฝ์ ์ ๋ ๋๋งํ๋ฉด์ ๊ฐ๋จํ๊ฒ ์ ์ง๋๋ค.
์ฆ UI ๋ก์ง์ ๋ถ๋ฆฌํจ์ผ๋ก์, View ๊ฐ ํ๊ฐ์ง ์ญํ ์๋ง ์ง์คํ ์ ์๋๋กํ๊ณ ์ด๋ ํด๋ฆฐ ์ฝ๋์ ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ค.
MVC ์ MVP ์ ์ฐจ์ด์
์ผํ๋ณด๋ฉด, Presenter ๊ฐ ํ๋ ์ญํ ์ด ๊ธฐ์กด MVC ํจํด์์ Controller ๊ฐ ํ๋ ์ญํ ๊ณผ ๋ณ ์ฐจ์ด๊ฐ ์์ด๋ณด์ธ๋ค.
Controller (MVC)
- View์ Controller ์๋ก ์ํฅ์ ์ค ์ ์๋ค.
- View๊ฐ Controller๋ฅผ ์ง์ ํธ์ถํ ์๋ ์๊ณ
- Controller๊ฐ View๋ฅผ ์ง์ ์กฐ์ํ ์๋ ์๋ค.
- Controller๋ ์ฃผ๋ก ์์ฒญ์ ๋ฐ๊ณ , ํ์ํ ๋ก์ง(Model ์กฐ์ ๋ฑ)์ ์ฒ๋ฆฌํ ๋ค, ๊ฒฐ๊ณผ๋ฅผ View์ ์ ๋ฌํ๋ค.
- ๊ตฌ์กฐ์ ์ผ๋ก ๋์จํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ด์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ View์ Controller๊ฐ ์ฝํ๊ธฐ ์ฝ๋ค.
์๋ฅผ ๋ค์ด, ํ์๊ฐ์ ํผ์ด ์๋ค๊ณ ํด๋ณด์.
- ์ฌ์ฉ์๊ฐ "๊ฐ์ " ๋ฒํผ ํด๋ฆญ (View)
- View๊ฐ Controller์ handleSignUp() ๋ฉ์๋๋ฅผ ํธ์ถ ( View๊ฐ Controller๋ฅผ ์ง์ ํธ์ถ )
- Controller๊ฐ ์ ๋ ฅ๊ฐ์ ๊ฒ์ฆ ( Controller๊ฐ View๋ฅผ ์ง์ ์กฐ์ )
- ๊ฒ์ฆ ์คํจ ์ → Controller๊ฐ View๋ฅผ ์กฐ์ํด์, "์ด๋ฉ์ผ์ด ์๋ชป๋์์ต๋๋ค" ๋ผ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ง์ View์ ํ์
Presenter (MVP)
- View๋ Presenter์๊ฒ ์์ ํ ์์กดํ๋ค.
- View๋ ์ง์ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ , ๋ชจ๋ ๋น์ฆ๋์ค ๋ก์ง ์์ฒญ์ Presenter์๊ฒ ์์ํ๋ค.
- Presenter๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณตํด์, View์๊ฒ "์ด๋ ๊ฒ ํ์ํด" ๋ผ๊ณ ๋ช ๋ น๋ง ํ๋ค.
- View๋ ๊ทธ ์ง์๋ฅผ ๋ฐ๋ผ ๋จ์ํ ํ๋ฉด์ ํ์๋ง ํ๋ค.
(View๋ Dumb Component, Passiveํ ์ญํ )
๊ฐ์ ํ์๊ฐ์ ํผ ์ ์ถ ์ํฉ์ ๋ณด์.
- ์ฌ์ฉ์๊ฐ "๊ฐ์ " ๋ฒํผ ํด๋ฆญ (View)
- View๋ ๊ทธ๋ฅ Presenter์๊ฒ "๊ฐ์ ์์ฒญ" ๋ฉ์์ง๋ง ๋ณด๋
- Presenter๊ฐ ๊ฒ์ฆ ๋ก์ง ์คํ
- ๊ฒ์ฆ ์คํจ ์ → Presenter๊ฐ View์๊ฒ "์๋ฌ๋ฅผ ํ์ํด๋ผ" ๋ผ๊ณ ๋ช ๋ น
- View๋ Presenter์ ์ง์์ ๋ฐ๋ผ ๋จ์ํ ์๋ฌ ๋ฉ์์ง๋ง ํ์
MVC | MVP | |
View์ Controller/Presenter ๊ด๊ณ | ์๋ฐฉํฅ | View → Presenter ๋จ๋ฐฉํฅ |
View ์ญํ | ์ด๋ฒคํธ ๊ฐ์ง + ์ง์ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅ | ์ด๋ฒคํธ ๊ฐ์ง๋ง ํ๊ณ ๋ก์ง์ ๋ชจ๋ Presenter์ ์์ |
Controller/Presenter ์ญํ | ๋ก์ง ์ฒ๋ฆฌ + View ์ง์ ์กฐ์ | ๋ก์ง ์ฒ๋ฆฌ + View์๊ฒ ๋ช ๋ น๋ง (View๋ Dumb) |
MVC ์์๋ View ์ Controller ์ ์ญํ ๊ตฌ๋ถ์ด ๋ชจํธํ๋ค. ์ค์ ๋ก ๋ด๊ฐ JS ์ฝ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋์๋,
์ด๋๊น์ง๋ฅผ View์ ์ญํ ๋ก ๋ณด๊ณ , ์ด๋๊น์ง๋ฅผ Controller ์ ์ญํ ๋ก ๋ด์ผํ ์ง ๋ชจํธํ๋ ๊ฒฝํ์ด ์๋ค. ๊ทธ๋ฌ๋ MVP ๋ ๋งค์ฐ ๋ช ํํ๊ฒ ์ญํ ๊ตฌ๋ถ์ด ๋๋ค.
MVVM(Model-View-ViewModel) ํจํด
UI ์ฝ๋(View)์ ๋น์ฆ๋์ค ๋ก์ง(Model)์ ViewModel์ ํตํด ๋ถ๋ฆฌํ๋ ์ํคํ ์ฒ ํจํด์ด๋ค.
์ฃผ์ ๋ชฉ์ ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํ UI์ ์ํ ๊ด๋ฆฌ์ ํจ์จํ์ด๋ค.
- Model: ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง
- View: ์ฌ์ฉ์ UI (HTML, ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ)
- ViewModel: View๋ฅผ ์ํ ๋ฐ์ดํฐ ๊ฐ๊ณต, ์ํ ๊ด๋ฆฌ, ์ก์
์ฒ๋ฆฌ (View์ Model์ ์ค๊ฐ์)
MVVM์ View์ ViewModel ์ฌ์ด์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด ์ํ๋ฅผ ๋๊ธฐํํ๋ฉฐ, View๋ ์์ UI ์ญํ ์ ์ง์คํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ViewModel์์ ๋ด๋นํ๋ค. ๋๋ถ์ View์ ๋ก์ง์ด ๊น๋ํ ๋ถ๋ฆฌ๋๊ณ , ํ ์คํธ์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
๊ฐ์ฅ ํฐ ํน์ง์ ์ฌ๊ธฐ์ View์ ViewModel์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ธ๋ฐ
- ์ฌ์ฉ์๊ฐ View์์ ์ ๋ ฅํ๋ฉด → ViewModel์ ๋ฐ๋ก ๋ฐ์๋๊ณ
- ViewModel์ด ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด → View๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋ค.
=> ๋ช ์์ ์ธ ์ ๋ฐ์ดํธ์ ํ์์ฑ์ด ์ค์ด๋ ๋ค. ViewModel ์ UI ๋ณ๊ฒฝ์ฌํญ์ ์๋์ผ๋ก ๋ฐ์ํ๊ธฐ ์ํด์
raw ํ Model ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ค.
View ์์ ์๋ก์ด ์ ๋ ฅ์ ๋ฐ์ผ๋ฉด, View ๋ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด ViewModel ์ ์ ๋ฐ์ดํธํ๋ค.
๊ทธ๋ฆฌ๊ณ ViewModel ์ ์ด ๋ณ๊ฒฝ์ฌํญ์ Model ์ ์ ์งํ๋ค.
๋ชจ๋ ๋ชจ๋ธ ๋ฐ์ดํฐ ์
๋ฐ์ดํธ๋ ๋ช
์์ ์ธ ์๋ก ๊ณ ์นจ ํธ์ถ ์์ด๋ ๋ฐ์ธ๋ฉ ๋ ๋ทฐ ์์ฑ์ ์๋์ผ๋ก ๋ฐ์์ด ๋๋ค.
๋ค์ ํ๋ฒ, ํ์๊ฐ์
์์ ๋ฅผ ๋ค๋ฉด,
- ์ฌ์ฉ์๊ฐ ์ด๋ฉ์ผ ์ ๋ ฅ
- ViewModel์ email ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ
- "๊ฐ์ " ๋ฒํผ ํด๋ฆญ
- ViewModel์ด ์ด๋ฉ์ผ์ ๊ฒ์ฆํ๊ณ Model์ ์ ์ฅ ์์ฒญ
- Model์ด ์ ์ฅ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ค
- ViewModel์ด ๊ฒฐ๊ณผ์ ๋ฐ๋ผ "๊ฐ์ ์ฑ๊ณต" ๋ฉ์์ง ๊ฐ์ ์ ๋ฐ์ดํธ
- View๋ ์ด ๊ฐ์ ๋ฐ์ธ๋ฉํด ๋ฐ๋ก "๊ฐ์ ์ฑ๊ณต"์ ํ๋ฉด์ ๋ณด์ฌ์ค
์ฅ์
- ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํตํด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ํํ๋ค.
- View๋ ์์ UI ์ญํ ์ ์ง์ค -> UI์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌ
- View์ ๋ก์ง์ด ๊น๋ํ ๋ถ๋ฆฌ๋๊ณ , ํ ์คํธ์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
๋จ์
- ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ๋ณต์ก๋ : ์๋ ๋ฐ์ธ๋ฉ์ ๊ฐ๋จํ UI์์๋ ํธ๋ฆฌํ์ง๋ง, ๋ณต์กํ ์ํ ํ๋ฆ์์๋ ์์์น ๋ชปํ ์ฌ์ด๋ ์ดํํธ๋ ๋๋ฒ๊น ์ด๋ ค์์ ์ ๋ฐํ ์ ์์
- ViewModel ์ค๊ณ๊ฐ ์ด๋ ค์ : View์ ์์ ํ ๋ถ๋ฆฌ๋ ViewModel์ ๋ง๋๋ ๊ฒ์ด ์ด์์ ์ด์ง๋ง, UI ์ข ์์ ์ธ ์ํ ์ฒ๋ฆฌ๊ฐ ๋ง์์๋ก ๊ฒฝ๊ณ๊ฐ ์ ๋งค
๋ฆฌ์กํธ์์ MVVM ์ฒ ํ์ด ์ด๋ป๊ฒ ๋ฐ์๋์๋๊ฐ?
๋ฆฌ์กํธ๋ MVVM ํจํด์ ViewModel ์ญํ ์ผ๋ถ๋ฅผ ์ปดํฌ๋ํธ๊ฐ ํก์ํ ํํ๋ก ๋ณผ ์ ์๋ค.
๋ค๋ง ๋ฆฌ์กํธ๋ MVVM์ ๋ช ์์ ์ผ๋ก ๋ฐ๋ฅด์ง๋ ์์ผ๋ฉฐ, ๊ทธ ๊ตฌ์กฐ๋ฅผ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ (unidirectional data flow) ์ ์ค์ฌ์ผ๋ก ์ฌํด์ํ ๋ฐฉ์์ด๋ผ๊ณ ๋ณด๋ ๊ฒ ๋ ์ ํํ๋ค. MVVM์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์ง์ํ์ง๋ง, React ๋ View ๊ฐ ๋ณํ๋ฉด ๋ช ์์ ์ผ๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผํ๋ค.
Model | ์ํ(State), API ์๋ต, ์ธ๋ถ ๋ฐ์ดํฐ |
ViewModel | ์ปดํฌ๋ํธ ๋ด๋ถ ๋ก์ง (hooks ํฌํจ: useState, useEffect, custom hooks ๋ฑ) |
View | JSX๋ก ํํ๋ UI |
๐ ๋ฐ์ธ๋ฉ ๊ด์ ์์์ ์ฐจ์ด
- MVVM์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์ง์ (ex. Angular, Vue)
- View๊ฐ ๋ณํ๋ฉด ViewModel์ ์๋ ๋ฐ์
- ViewModel์ด ๋ณํ๋ฉด View์ ์๋ ๋ฐ์
- React๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ (one-way binding)
- ์์ → ํ์๋ก props ์ ๋ฌ
- View๊ฐ ๋ณํ๋ฉด setState๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ๋ช ์์ ์ผ๋ก ์ํ ๋ณ๊ฒฝ
๋ฆฌ์กํธ๋ ์ด๋ค ์ํคํ ์ฒ๋ก ๊ตฌ์ฑ๋์ด ์์๊น?
๋ฆฌ์กํธ๋ ์ ํต์ ์ธ MVC, MVVM ๊ฐ์ ๊ณ ์ ์ํคํ
์ฒ ํจํด์ ์๊ฒฉํ ๋ฐ๋ฅด์ง ์๊ณ , ์์ฒด์ ์ผ๋ก “์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ”์ “๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(Unidirectional Data Flow)” ์ ๊ธฐ๋ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
Component-Based Architecture (์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ)
- UI๋ฅผ ์๊ณ ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ตฌ์ฑ
- ๊ฐ ์ปดํฌ๋ํธ๋ ์์ฒด ์ํ(state)๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅ
- ์ปดํฌ๋ํธ๋ ํจ์ํ (Function Component) ๋๋ ํด๋์คํ (Class Component) ์ผ๋ก ์์ฑ ๊ฐ๋ฅ
Container-Presenter ํจํด
- UI ๊ตฌ์ฑ๊ณผ ๋ก์ง ์ฒ๋ฆฌ๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ก ํธ์๋ ์ํคํ ์ฒ ํจํด
- React ํ๊ฒฝ์์ ๋ง์ด ํ์ฉ๋๋ฉฐ, ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ, ๊ฐ๋ ์ฑ, ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ฌ์ค๋ค.
// ๐ UserContainer.jsx
import { useEffect, useState } from 'react';
import UserPresenter from './UserPresenter';
export default function UserContainer() {
const [user, setUser] = useState(null);
useEffect(() => {
fetch('/api/user')
.then(res => res.json())
.then(data => setUser(data));
}, []);
return <UserPresenter user={user} />;
}
// ๐ UserPresenter.jsx
export default function UserPresenter({ user }) {
if (!user) return <p>Loading...</p>;
return (
<div>
<h1>{user.name}</h1>
<p>{user.email}</p>
</div>
);
}
๐ ์ฅ์
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ (Separation of Concerns)
→ UI ๋ก์ง๊ณผ ์ํ ๊ด๋ฆฌ๋ฅผ ๋๋ ์ ์ ์ง๋ณด์ ๋ฐ ํ ์คํธ ์ฉ์ด์ฑ ํ๋ณด - ์ฌ์ฌ์ฉ์ฑ ๋์ Presenter ์ปดํฌ๋ํธ ์์ฑ ๊ฐ๋ฅ
- ํ ์คํธ๊ฐ ์ฌ์ (Presenter๋ ์์ ํจ์ํ UI)
โ ๋จ์ / ๋ณด์์
- ๋๋ฌด ๋ถ๋ฆฌํ๋ฉด ํ์ผ ๊ตฌ์กฐ๊ฐ ์ง๋์น๊ฒ ๋ง์์ ธ ๋ณต์ก๋ ์ฆ๊ฐ
- Hooks์ custom hooks์ ๋ฐ๋ฌ๋ก ์ต๊ทผ์๋ ์ผ๋ถ ๋ก์ง๋ง hook์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝํฅ๋ ์์ (→ Smart-Dumb ์ปดํฌ๋ํธ ํจํด์ผ๋ก ์ ์ฌํ๊ฒ ๋ฐ์ )
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(Unidirectional Data Flow)
- ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก props๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋จ
- ๋ฐ์ดํฐ ํ๋ฆ์ด ํ ๋ฐฉํฅ์ผ๋ก ์ ํ๋๋ฏ๋ก ์ํ ์ถ์ ๊ณผ ๋๋ฒ๊น ์ด ์ฉ์ดํจ
FLUX ํจํด
๋ฆฌ์กํธ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(Unidirectional Data Flow) ์ ์ฒด๊ณ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด Facebook์ด ์ ์ํ ์ํคํ ์ฒ ํจํด์ด๋ค.
๋ณต์กํ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ช ํํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ณ ์๋์๋ค.
๋ฆฌ์กํธ ์์ฒด๋ ์ํ๋ฅผ useState์ props ์ ๋ฌ๋ก ๊ด๋ฆฌํ์ง๋ง, ๋ณต์กํ ์ฑ์์๋ ์ธ๋ถ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํคํ ์ฒ๊ฐ ๊ฒฐํฉ๋๋ค.
์์๋ก ๋ฆฌ์กํธ์ ๋จ๋ฐฉํฅ ํ๋ฆ์ ๊ตฌ์กฐํํ ๊ฒ์ด Flux ์ํคํ ์ฒ์ด๋ฉฐ, ์ด๋ฅผ ๊ตฌํํ ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Redux ์ด๋ค.
- Action : ์ฌ์ฉ์์ ์ ๋ ฅ, ์๋ฒ ์๋ต ๋ฑ ‘๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง’๋ฅผ ๋ด์ ๊ฐ์ฒด (type๊ณผ payload๋ฅผ ํฌํจ)
- Dispatcher : ๋ชจ๋ Action์ ๋ฐ์์ ๋ฑ๋ก๋ Store์ ์ ๋ฌํ๋ ์ค์ ํ๋ธ (Flux์ ํต์ฌ ์ฐจ๋ณ์ )
- Store : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ(State) ์ ์ํ ๋ณ๊ฒฝ ๋ก์ง์ ๋ณด๊ด
- View : React ์ปดํฌ๋ํธ๋ก, Store๋ฅผ ๊ตฌ๋ ํ์ฌ ์ํ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง
๋ฆฌ์กํธ ํจํด์ ์งํ (์ญ์ฌ ํ๋ฆ ์ ๋ฆฌ)
1. MVC, MVVM (2010๋ ์ด์ ~ React ๋ฑ์ฅ ์ )
- ์น ๊ฐ๋ฐ์์ ๋๋ฆฌ ์ฌ์ฉ๋ ํจํด๋ค.
- MVC๋ Model-View-Controller ๊ตฌ์กฐ๋ก, ๋ฐ์ดํฐ-UI-๋ก์ง์ ๋ถ๋ฆฌํจ.
- MVVM์ ViewModel์ ๋์ด View ↔ Model ๊ฐ ๋ฐ์ธ๋ฉ ์๋ํ๋ฅผ ๊ฐ์กฐ.
- ํ์ง๋ง ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ผ๋ก ์ธํด ๋ณต์ก๋ ์์น, ๋๋ฒ๊น ์ด๋ ค์.
2. React์ ๋ฑ์ฅ: Component ๊ธฐ๋ฐ UI (2013~)
- React๋ View๋ง ๋ด๋นํ๋ฉฐ, UI๋ฅผ Component ๋จ์๋ก ๋ถ๋ฆฌ.
- ์ ์ธํ UI, ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ, ๊ฐ์ DOM์ด๋ผ๋ ํ์ ์ ๊ฐ๋ ๋์ .
3. Container-Presenter ํจํด (2014~2015)
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ์ํด ๋์
.
- Container: ์ํ ๊ด๋ฆฌ ๋ฐ ๋ก์ง ๋ด๋น
- Presenter: UI ํํ๋ง ๋ด๋น (props๋ง ๋ฐ์)
- ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ ํฅ์์ ๋ชฉํ
4. Flux (2014)
- ํ์ด์ค๋ถ์ด ์ ์ํ ์ํ ๊ด๋ฆฌ ์ํคํ ์ฒ.
- Action → Dispatcher → Store → View ํ๋ฆ์ ๋จ๋ฐฉํฅ ๊ตฌ์กฐ.
- ๊ตฌ์กฐ๋ ๋ช ํํ์ง๋ง ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๋ง๊ณ Dispatcher๊ฐ ๋ฒ๊ฑฐ๋ก์.
5. Redux (2015)
- Flux์ ๋ณต์กํจ์ ์ค์ธ ๊ฐ์ ๋ฒ์ .
- ํต์ฌ ๊ฐ๋ : ๋จ์ผ Store + ์์ Reducer ํจ์ + Action
- Time-travel debugging ๊ฐ๋ฅ, ๋ฏธ๋ค์จ์ด ๋์ ๊ฐ๋ฅ.
- ๋ํ ํ๋ก์ ํธ์์ ๋๋ฆฌ ์ฑํ๋จ.
'ํ๋ก ํธ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
building a File Tree UI given a list of File objects (0) | 2025.04.24 |
---|