DevExpress.Mvvm.PocoToolkit

๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค์˜ POCO ์Šคํƒ€์ผ ๋ทฐ๋ชจ๋ธ์„ ํŽธํžˆ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด๋ณธ ๊ธฐ์ดˆ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
ํ˜„์‹ค์ ์œผ๋กœ (์ €๋ฅผ ๋น„๋กฏํ•˜์—ฌ) ๋งŽ์€ ๋ถ„๋“ค์ด ๋‹ท๋„ทํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘์—…์„ ํ•˜๊ณ  ๊ณ„์‹ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
๋‹ท๋„ทํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์†Œ์Šค์ œ๋„ค๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ ๋๋‚ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›๋ฐ›์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค์—์„œ ์ง€์›ํ•˜๋Š” POCO ๋Ÿฐํƒ€์ž„ ๊ฐ์ฒด ์ƒ์„ฑ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†์„๊นŒ ๊ณ ๋ฏผํ•˜๋˜ ์ฐจ์—,
ํ”„๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ œ์ž„์Šค๋‹˜์˜ ์ฑ…์ž ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜์—ฌ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

6๊ฐœ์˜ ์ข‹์•„์š”

๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค์˜ POCO ๋Š” ์‚ฌ์•ผ ๋˜๋Š” ๊ฑฐ์ฃ  ?
์–ด๋–ค ๋ถ€๋ถ„์ด ๋” ํŽธํ•˜๋‹ค๋Š” ๊ฑด์ง€ ๋นก ์™€๋‹ฟ์ง€ ์•Š์•„์š”โ€ฆ

3๊ฐœ์˜ ์ข‹์•„์š”

์šฐ์„ 
์žฌ์›…๋‹˜์˜ Jamesnet.Wpf๋ฅผ ์‚ฌ์šฉํ• ๋•Œ์—๋Š”
CommunityToolkit.Mvvm ๊ณผ Prism์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์ถ•ํ•œ ๋ฐ˜๋ฉด

๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค๋งŒ์˜ ๊ธฐ์ˆ ๋กœ Jamesnet.Wpf๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ–ˆ๋‹ค๋Š”๊ฒŒ ํฌ์ธํŠธ ์ธ๊ฒƒ๊ฐ™๋„ค์š”!

2๊ฐœ์˜ ์ข‹์•„์š”

์•„๋‹ˆ์š” DX MVVM์€ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค.

์˜›๋‚ ์— ์ œ๊ฐ€ ์„ธ์…˜์—์„œ ๋ฐœํ‘œํ•œ ์ ๋„ ์žˆ๊ธด ํ–ˆ์—ˆ๋Š”๋ฐ, ๋‹น์‹œ์— ์†Œ์Šค์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜ CommunityToolkit.Mvvm ์ด ์—†์–ด์„œ ์ €๋„ POCO ViewModel ์Šคํƒ€์ผ๋กœ ์š”๊ธดํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ CommunityToolkit์—๋Š” .NET 5 ํƒ€๊ฒŸํŒ… ๋นŒ๋“œ๊ฐ€ ์—†์–ด์„œ .NET Standard 2.0 ํƒ€๊ฒŸํŒ… ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

christian289/dotnetconfmini2205: .NET Conf Mini 22.05 ๋ฐœํ‘œ ์ž๋ฃŒ ๋ฐ ์˜ˆ์ œ ์ฝ”๋“œ (github.com)

5๊ฐœ์˜ ์ข‹์•„์š”

@์„์ค€_ํ™ฉ ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

POCO๋Š” ์ฒ˜์Œ ๋ณด๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, Framework์—์„œ ์†Œ์Šค์ œ๋„ค๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋Œ€์•ˆ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

3๊ฐœ์˜ ์ข‹์•„์š”

๊ด€์‹ฌ๊ฐ€์ ธ์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์„ค๋ช…์ด ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„ ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์œก์•„์ค‘์ด๋ผ ์ž ๊น ์•‰์•„์„œ ํƒ€์ž๋ฅผ ์น  ์งฌ์ด ์•ˆ๋‚ฉ๋‹ˆ๋‹ค. ^^; ์กฐ๋งŒ๊ฐ„ ๋ถ€์—ฐ์„ค๋ช…์„ ๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

DevExpress.MVVM์€ ๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค์—์„œ MIT ๋ผ์ด์„ ์Šค๋กœ ์ œ๊ณตํ•˜๋Š” WPf์˜ MVVM ๊ด€๋ จ ์˜คํ”ˆ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ ์ค‘์—์„œ POCO ViewModel ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด์‹œ๋ฉด, ํŠน์ • ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋“ค์„ ์ƒ๋‹นํžˆ ์ค„์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [Command] ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ณต๊ฐœ ๋ฉ”์†Œ๋“œ ์œ„์— ์ ์–ด ๋‘” ๋’ค์— ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์ปค๋งจ๋“œ ํŒจํ„ด์„ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.(๋ฌผ๋ก  ์ƒ๋žต๋„ ๊ฐ€๋Šฅ)

์ด ๊ธฐ๋Šฅ์˜ ์ง€์›์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ViewModelSource๋ผ๊ณ  ํ•˜๋Š” ํด๋ž˜์Šค์˜ Create ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.(https://github.com/DevExpress/DevExpress.Mvvm.Free/blob/main/DevExpress.Mvvm/ViewModels/ViewModelSource.cs)
(์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์ง€์š”? ์ด์ง„ ํ‘œํ˜„์‹, ๋ฆฌํ”Œ๋ ‰์…˜, il ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ณจ๊ณ ๋ฃจ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค ํŒ€์— ๋ฐ•์ˆ˜๋ฅผโ€ฆ) ์ด๊ฒƒ์„ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•ด ๋‘” ๋’ค ์ฐพ์•„์˜ฌ ๋•Œ๋Š” POCO ์Šคํƒ€์ผ์˜ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์˜ค๋„๋ก ์„ค๊ณ„ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์˜คํ†  ์™€์ด์–ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„์˜จ ๋ชจ๋“  ๋ทฐ๋ชจ๋ธ์€ ์ž๋™์œผ๋กœ POCO ์Šคํƒ€์ผ์˜ ๋ทฐ๋ชจ๋ธ๋กœ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋”ํ•ด, ์žฌ์›…๋‹˜์ด ๋งŒ๋“ค์–ด์ฃผ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šค์˜ Region ๊ธฐ๋Šฅ์„ ์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ๋‘์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ถ€๋ถ„์€ ์†Œ์Šค ๋‚ด๋ถ€์˜ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•ด ์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ์ ์ ˆํžˆ ์‚ด์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋งž์ถคํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.(์•„์ง๊นŒ์ง€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์—์„œ ํฐ ๋ฌธ์ œ๋Š” ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•„์„œ ์ €๋„ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. :grin:)

๋‹ต๋ณ€์ด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ํœด์ผ์ด ๋˜๋ฉด ์‹œ๊ฐ„์ด ์ข€ ์ƒ๊ธธ ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๋” ์ •์‹ ์—†๋„ค์š”. :joy:

3๊ฐœ์˜ ์ข‹์•„์š”

์ €๋„ MVVM์— ํ•„์š”ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ƒ๋‹น์ˆ˜ ์ค„์—ฌ์ค€๋‹ค๋Š” ์ ์— ์ด์ „์— ์‚ฌ์šฉํ•ด๋ณธ ์œ ์ €๋กœ์จ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ dxmvvm์„ ์ด์šฉํ•˜๋˜ ์‹œ์ ˆ์€ .NET 5๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์„ ์งํ›„ ์˜€์ง€๋งŒ, .NET 6๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ Source Generator๋ฅผ ํƒ‘์žฌํ•œ MvvmLight์˜ ๊ณ„์Šน์ธ CommunityToolkit.Mvvm์„ MS์—์„œ ๊ณต์‹์ง€์›ํ•˜๋ฉด์„œ ์•ˆ์“ฐ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”.

ํ˜น์‹œ ๊ณ„์† ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ CommunityToolkit.Mvvm์— ๋น„ํ•ด์„œ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์•„์‹œ๊ฒ ์ง€๋งŒ POCO ViewModel ํ˜•ํƒœ๋Š” Runtime ์—์„œ ๋””๋ฒ„๊น…ํ•  ๋•Œ ์กฐ์‚ฌ์‹์„ ํ™•์ธํ•ด๋ณด๋ฉด pocoviewmodel๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค์€ ํƒ€์ž…๋’ค์— ์ด์ƒํ•œ hash ๊ฐ’ ๋น„์Šทํ•œ๊ฒŒ ๋ถ™์–ด์žˆ์–ด์„œ ๋ณด๊ธฐ์— ์กฐ๊ธˆ ์ง€์ €๋ถ„ํ•ด์„œ ๋ณด๊ธฐ ์•ˆ์ข‹์•˜๋˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

4๊ฐœ์˜ ์ข‹์•„์š”

dxmvvm๊ณผ์˜ ๋น„๊ต๋ฅผ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ ์†”์งํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :sweat_smile: ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ๋Œ€๋กœ ๋‹ท๋„ท ํ”„๋ ˆ์ž„์›Œํฌ (+ํšŒ์‚ฌ์—์„œ ์‚ฌ์ค€ ๋ฐ๋ธŒ์ต์Šคํ”„๋ ˆ์Šคโ€ฆ) ์ž‘์—… ํ™˜๊ฒฝ์—์„œ์˜ ๋Œ€์•ˆ์„ ์ฐพ์•„ ๋ณธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋ถ„๋“ค์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ ๊ธฐ์ˆ ์„ ์„ ํƒํ•ด ์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”! ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ตณ์ด ๋น„๊ต๋ฅผ ํ•˜์ž๋ฉด, ๋ฐ๋ธŒ ์ต์Šคํ”„๋ ˆ์Šค์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” MIF ๊ธฐ๋Šฅ๋“ค์ด ๊ฝค ๊ดœ์ฐฎ์•„์„œ ์ปจํŠธ๋กค๋ณ„ ๋ชจ๋“ˆํ™”๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” CommunityToolkit.Mvvm์— ๋”ํ•ด ํ”„๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ DevExpress.Mvvm ํ•˜๋‚˜๋กœ ํ†ต์ผ์„ฑ์žˆ๋Š” ์ž‘์—…์ด ๋œ๋‹ค๋Š” ํŽธ๋ฆฌํ•จ์€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ฐธ์กฐ ์ž๋ฃŒ ์ž์ฒด๋Š” ๋Œ€๋ถ€๋ถ„์ด CommunityToolkit.Mvvm ๊ธฐ๋ฐ˜์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—…ํ™˜๊ฒฝ์„ ์„ ํƒํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ผ๋ฉด ์ž๋ฃŒ๊ฐ€ ๋งŽ์€ ์ชฝ์„ ์„ ํƒํ•˜๋ผ๊ณ  ๊ถŒํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
POCO ViewModel์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ƒ์†์„ ๊ตฌํ˜„ํ•  ๋•Œ ํด๋ž˜์Šค ์ด๋ฆ„์— ๋™์ ์œผ๋กœ UUID๊ฐ€ ๋ถ™๋Š” ๊ฒƒ์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ํŠน๋ณ„ํžˆ ๋ถˆํŽธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. :grin:

3๊ฐœ์˜ ์ข‹์•„์š”