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