Introduction to MVVM for WPF - ChoDragon9/posts GitHub Wiki
title: Introduction to MVVM for WPF sidebar: auto
์ด ๋ฌธ์๋ MVVM์ ์ต์ด๋ก ์ธ๊ธ๋ Introduction to Model/View/ViewModel pattern for building WPF apps๋ฅผ ๋ฒ์ญํ ๋ฌธ์์ ๋๋ค.
๋ณธ๋ฌธ์์ฝ
- Model๊ณผ View๋ MVC์์ ์ ์๋ ์ญํ ๊ณผ ๋์ผํฉ๋๋ค.
- Model์ ์ํ์ ์ฅ, ๋น์ฆ๋์ค ๋ก์ง, ์์ํ ๋ฐ์ดํฐ์ ๋๋ค.
- View๋ ์๊ฐ์ ์ธ ์์๋ฅผ ๋ด๋นํฉ๋๋ค.
- ViewModel๋ View๊ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์๋ Model์ ์ ๋ฌธํํฉ๋๋ค.
- Model Type์ View Type์ผ๋ก ๋ณํํ๋ ๋ฐ์ดํฐ ๋ณํ๊ธฐ ์ญํ
- View๊ฐ Model๊ณผ ์ํธ์์ฉ ํ ์ ์๊ฒ ํ๋ ์ญํ
- UI์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ถ๋ถ์ ๋ํ ์ถ์์ ํํ
- Selection๊ณผ Commands๋ฅผ ํฌํจ
๋ฒ์ญ
MVVM์ MVC์ ๋ณํ์ผ๋ก, ํ๋ UI ๊ฐ๋ฐ ํ๋ซํผ์ ๋ง๊ฒ ์ ์๋์์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์๋ ๋์์ด๋๊ฐ ๋ด๋นํฉ๋๋ค. ์ด ์ค๊ณ๋ HTML ๋๋ XAML๊ณผ ๊ฐ์ ์ ์ธ์ ํํ๋ก ๊ฑฐ์ ํญ์ ์ํ๋๋ฉฐ, Dreamweaver, Flash ๋๋ Sparkle๊ณผ ๊ฐ์ WYSIWYG ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋งค์ฐ ๋ง์ต๋๋ค. ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋์ ํ๊ฒฝ๊ณผ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋๋ Smalltalk ๊ธฐ์์์ ์น์ ๋งค์ฐ ์น์ํ ํ๋์ ํ๊ฒฝ ๋ฐ ํ์ฌ Avalon ๊ฐ๋ฐ๋ก ๋ฐ์ ํ๋ MVC ๋ํ MVVM์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ํ ์ผ๋ฐ์ ์ธ ๋ฉ์ปค๋์ฆ์ ์์กดํฉ๋๋ค. ๋์ค์ ๊ทธ ๋ฉ์ปค๋์ฆ์ ์์กดํฉ๋๋ค.
MVC์์ ์ ์๋ Model์, ์ํ๋ฅผ ์ ์ฅ
ํ๊ณ ๋ฌธ์ ์์ญ์ ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ
๋๋ ๋น์ฆ๋์ค ๋ก์ง
์ด๋ฉฐ, ์ฝ๋๋ก ์์ฑ๋๊ฑฐ๋ ๊ด๊ณํ ํ
์ด๋ธ๋ก ์ํธํ๋ ์์ ๋ฐ์ดํฐ
๋ก ํํ๋ฉ๋๋ค. MVVM์ View๋ GUI์ ์๊ฐ์ ์์, ๋ฒํผ, ์๋์ฐ, ๊ทธ๋ํฝ ๋ฐ ๋ณด๋ค ๋ณต์กํ ์ ์ด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
ํค๋ณด๋ ๋จ์ถํค๋ฅผ ์ธ์ฝ๋ฉํ๊ณ ์ปจํธ๋กค ์์ฒด๋ MVC์ Controller ์ฑ
์์ธ ์
๋ ฅ ์ฅ์น์์ ์ํธ ์์ฉ์ ๊ด๋ฆฌํฉ๋๋ค. (ํ๋์ GUI ๊ฐ๋ฐ์์ ์ปจํธ๋กค๋ฌ์ ์ ํํ ์ผ์ด๋ฌ๋ ๊ฒ์ ๊ธด ๋ณํ์
๋๋ค. ์ ๋ ๊ทธ๊ฒ์ด ๊ทธ๋ฅ ํฌ๋ฏธํด์ก๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ ํ ์กด์ฌํ์ง๋ง, ์ฐ๋ฆฌ๋ 1979๋
์ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค.)
View๋ ๊ฑฐ์ ํญ์ ์ ์ธ์
์ผ๋ก ์ ์๋๋ฉฐ, ๋๊ตฌ ๋ฐ ์ ์ธ ์ธ์ด์ ํน์ฑ์ View ํด๋์ค์์ MVC๊ฐ ์ธ์ฝ๋ฉํ๋ ์ผ๋ถ View ์ํ๋ ํํํ๊ธฐ ์ฝ์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด UI์๋ ์ปจํธ๋กค์ ๋์์ด๋ ์๊ฐ์ ๋ชจ์์ ๋ณ๊ฒฝํ๋ "๋ณด๊ธฐ ๋ชจ๋" ๋ฐ "ํธ์ง ๋ชจ๋"์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ํธ ์์ฉ ๋ชจ๋๊ฐ ์์ ์ ์์ง๋ง ์ด๋ฌํ ๋ชจ๋๋ ํญ์ XAML์์ ํฌ๊ฒ ์์ํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ๋ฅผ ๋์ค์ ํด๊ฒฐํ ๊ฒ์ด๋ค.
์ด ์์ ์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ์ํ๋ฉ๋๋ค. ๊ฐ๋จํ ์์์ View๋ Model์ ์ง์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. Model์ ์ผ๋ถ๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ผ๋ก ๋ณด๊ธฐ์๋ง ํ์๋ฉ๋๋ค. Model์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ง์ ํธ์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Model์ Boolean์ CheckBox์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๊ฑฐ๋ ๋ฌธ์์ด ํ๋๋ฅผ TextBox์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ํนํ Model์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ ์ ์๋ ๊ธฐ์กด ํด๋์ค ๋๋ ๋ฐ์ดํฐ ์คํค๋ง์ธ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ UI์ ์ผ๋ถ๋ง Model์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. Model์๋ ์ปจํธ๋กค์ ์ง์ ๋งคํํ ์ ์๋ ๋ฐ์ดํฐ ์ ํ์ด ์์ ์ ์์ต๋๋ค. UI๋ ๊ธฐ์กด Model์ ์๊ฒฉํ ์ ์์๋ ๋ง์ง ์์ง๋ง Model์ ํฌํจ๋์ด ์์ง ์์ ์ฝ๋๋ก ๊ตฌํํด์ผ ํ๋ ๋ณต์กํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๋ ์ ํ์ด๋ ๋ชจ๋์ ๊ฐ์ ๋ณด๊ธฐ ์ํ๋ฅผ ๋ฃ์ ์ฅ์๊ฐ ํ์ํ๋ค.
ViewModel
์ ์ด๋ฌํ ์์
์ ๋ด๋นํฉ๋๋ค.
์ด ์ฉ์ด๋ View์ Model
์ ์๋ฏธํ๋ฉฐ View์ ์ถ์ํ๋ก ๊ฐ์ฃผ๋ ์ ์์ง๋ง View๊ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์๋ Model์ ์ ๋ฌธํ
ํฉ๋๋ค.
์ด ์ญํ ์์ ViewModel์ Model Type์ View Type์ผ๋ก ๋ณํํ๋ ๋ฐ์ดํฐ ๋ณํ๊ธฐ
๋ฅผ ํฌํจํ๋ฉฐ,
View๊ฐ Model๊ณผ ์ํธ ์์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช
๋ น
์ ํฌํจํฉ๋๋ค.
์ด๋ฌํ ์์ด๋์ด๋ฅผ ๊ฐ๋ฐํ๊ณ , ํนํ ViewModel์ View๋ฅผ ์ดํ ํฌ์คํธ์์ Commands์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ํจํด์ ๋ช ํํ ํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์์ ๊ทธ๋ฆผ์ ์คํํด UI์ ์๋ ์ธ ๊ฐ์ ํธ์ง ํจ๋์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ํธ์ง ํจ๋์ MVVM ํจํด์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ๋์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒ์ ๋งจ ์์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ๋์ ๋๋ค.
Model์ ์ด์ ๋ธ๋ฆฌ ๋ชฉ๋ก์ด๋ฉฐ, ๊ฐ ์ด์ ๋ธ๋ฆฌ ๋ชฉ๋ก๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค. View๋ ํจ๋ ํฌ๋กฌ ์ปจํธ๋กค๊ณผ ์ผ๋ จ์ ์คํ์ผ ๋ฐ ๋ฐ์ดํฐ ํ๋ ์ดํธ ๋ชฉ๋ก์ ํ์ํ๋ Box ์ปจํธ๋กค์ ๋ชฉ๋ก์ ๋๋ค. ComboBox๋ ์ด์ ๋ธ๋ฆฌ ์ด๋ฆ์ผ๋ก ์ง์ ์ฐ๊ฒฐ๋๋ฉฐ ๋ชฉ๋ก ์์์ ํญ๋ชฉ์ ์ ์ด ์ด๋ฆ์์ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ViewModel์ ํ์ฌ ์ ํ๋ ๊ณตํต ์ปดํฌ๋ํธ์ด๋ฉฐ, ํ๋์ ์ปจํธ๋กค์ ์ฝ์ ํ๊ธฐ ์ํ ๋ช ๋ น์ด์ ๋๋ค. ์ ์ ํ์ฌํญ์ด View์ ๋จ์ ์์ง ์์์ง ๊ถ๊ธํฉ๋๋ค. ์ด๊ฒ์ View์ ๋ง์ ์ปจํธ๋กค์ด ๋จ์ผ ์ ํ์ ๋ฐ๋ผ ์กฐ์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ ViewModel์์ ์ ํํ ํญ๋ชฉ์ ๋จ์ผ ํํ์ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ด ๋ชจ๋ ViewModel์์ ๋ ์ฝ์ต๋๋ค. ComboBox์ ์ํด ์ ํ๋๋ฉฐ ๋ํ ListBox์ ์ํด ํ์๋๋ ๋ชฉ๋ก ๋ฐ์ดํฐ์ ๋๋ค. ๋ํ ์ค๊ณ์๋ ์กฐ์ ํญ๋ชฉ์ ๋ณต์ฌํ์ง ์๊ณ ๊ณตํต ์ปดํฌ๋ํธ์ ListBox๋ฅผ ์ฌ์ฉํ๊ณ ์ ์ด ๋ชฉ๋ก์ ComboBox๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
๋ชจ์ ํจ๋์ ์คํํด ํธ์ง ์์ญ์์ ์ ํํ ๋ชจ์ ๋๋ ์ปจํธ๋กค์ Model๋ก ์ฌ์ฉํฉ๋๋ค. View์๋ ์ ํ ํญ๋ชฉ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์์ฑ(๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ ๋ฐ ๋ธ๋ฌ์ ์์ฑ, ๋ธ๋ฌ์ ๋๋ ํ์ด ์๋ฆฌ๋, ๊ทธ๋ผ๋ฐ์ด์
๋ฑ) ๋ฐ ์์ ๊ตฌ์ฑ ์์ ํธ์ง์ ์ํ ์์ ์คํํธ๋ผ์ ํ์ํ๋ ListBox๊ฐ ์์ต๋๋ค. ViewModel์๋ ์ ํํ ์์ฑ, ๊ทธ๋ผ๋ฐ์ด์
ํธ์ง ์ ์ ํ๋ ๊ทธ๋ผ๋ฐ์ด์
์ ์ง, ์์ ์คํํธ๋ผ์ ์์น์ ์์์ ๋งคํํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๋ณํ๊ธฐ, ํธ์ง ์ค์ธ ํ๊ณผ ๋ธ๋ฌ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ช
๋ น์ด ํฌํจ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ Model์ Avalon์ ์ํด ์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ก๊ณ , ViewModel์ ์ฝ๊ฒ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ฌด์ธ๊ฐ๋ก ๋ฐ๋ ์ ์์๊ณ , ViewModel์ ์ด UI์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ถ๋ถ์ ๋ํ ์ถ์์ ํํ
์ ์ ๊ณตํฉ๋๋ค.
๋ง์ง๋ง ์๋ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ ํจ๋์
๋๋ค. ์ฌ๊ธฐ Model์ MSBuild Project์
๋๋ค. ์ด์ ์ ์กด์ฌํ๋ Model ํด๋์ค์
๋๋ค. View๋ ํธ๋ฆฌ ์ปจํธ๋กค, ์คํฌ๋กค ์์ญ์ด๋ฉฐ ์ปจํ
์คํธ ๋ฉ๋ด๋ฅผ ํฌํจํฉ๋๋ค. ViewModel์ Avalon ์์ด ์ค๊ณ๋์์ผ๋ฉฐ(๋ช
๋ น์ค์์ ์๋ฒฝํ๊ฒ ์๋) ๋ฐ์ดํฐ๊ฐ ๋ฐ์ธ๋ฉ
๋ ์ ์๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ Selection ๋ฐ Commands๊ฐ ํฌํจ
๋์ด ์์ต๋๋ค.
MVVM ํจํด์ ํ์ํ๋ฉด UI ๋ฌธ์ ๊ฐ ํด๋น ์ฉ์ด์ ๋น ๋ฅด๊ฒ ํ์๋ฉ๋๋ค. ์ค์ ๋ก ์ ์ฒด ์คํํด UI๋ ํจํด์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค. ๋ชจ์ ํจ๋์ Model์ธ "ํธ์ง ์์ญ์์ ์ ํํ ๋ชจ์ ๋๋ ์ปจํธ๋กค"์ ๊ทธ ์์ฒด๋ก Scene ํธ์ง๊ธฐ์ ViewModel ๊ฐ๋ ์ ๋๋ค. ์คํํด ๋ด๋ถ์ ํจ๋ ๋ ์ด์์์๋ ๋ชจ๋ ๋ฑ๋ก๋ ํจ๋ ๋ชฉ๋ก, View๋ฅผ ์์น์ํค๋ ๋ถํ ๊ธฐ๊ฐ ์๋ ๊ทธ๋ฆฌ๋, ๊ทธ๋ฆฌ๊ณ ํ์ฌ ํ์๋๋ ํจ๋๊ณผ ํด๋น ํจ๋์ ๋ ผ๋ฆฌ์ ์ปจํ ์ด๋๊ฐ ํฌํจ๋ ViewModel๋ก ๊ตฌ์ฑ๋ Model์ด ์์ต๋๋ค.
์๋ณธ
Introduction to Model/View/ViewModel pattern for building WPF apps