๋ฐ๋ธ์ต์คํ๋ ์ค์ POCO ์คํ์ผ ๋ทฐ๋ชจ๋ธ์ ํธํ ํ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด๋ณธ ๊ธฐ์ด์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
ํ์ค์ ์ผ๋ก (์ ๋ฅผ ๋น๋กฏํ์ฌ) ๋ง์ ๋ถ๋ค์ด ๋ท๋ทํ๋ ์์ํฌ๋ก ์์
์ ํ๊ณ ๊ณ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐ์ ํฉ๋๋ค.
๋ท๋ทํ๋ ์์ํฌ์์๋ ์์ค์ ๋ค๋ ์ดํฐ์ ๊ฐ์ ๋๋ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ง์๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์
๋ฐ๋ธ์ต์คํ๋ ์ค์์ ์ง์ํ๋ POCO ๋ฐํ์ ๊ฐ์ฒด ์์ฑ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ ์ ์์๊น ๊ณ ๋ฏผํ๋ ์ฐจ์,
ํ๋ฆฌ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์์ค๋์ ์ฑ
์ ๋ด์ฉ์ ์ฐธ์กฐํ์ฌ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
๋ฐ๋ธ์ต์คํ๋ ์ค์ POCO ๋ ์ฌ์ผ ๋๋ ๊ฑฐ์ฃ ?
์ด๋ค ๋ถ๋ถ์ด ๋ ํธํ๋ค๋ ๊ฑด์ง ๋นก ์๋ฟ์ง ์์์โฆ
์ฐ์
์ฌ์
๋์ Jamesnet.Wpf๋ฅผ ์ฌ์ฉํ ๋์๋
CommunityToolkit.Mvvm ๊ณผ Prism์ ์ฌ์ฉํด์ ๊ตฌ์ถํ ๋ฐ๋ฉด
๋ฐ๋ธ์ต์คํ๋ ์ค๋ง์ ๊ธฐ์ ๋ก Jamesnet.Wpf๊ณผ ๋น์ทํ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ๋ค๋๊ฒ ํฌ์ธํธ ์ธ๊ฒ๊ฐ๋ค์!
์๋์ DX MVVM์ ๋ฌด๋ฃ์ ๋๋ค.
์๋ ์ ์ ๊ฐ ์ธ์ ์์ ๋ฐํํ ์ ๋ ์๊ธด ํ์๋๋ฐ, ๋น์์ ์์ค์ ๋๋ ์ดํฐ ๊ธฐ๋ฐ CommunityToolkit.Mvvm ์ด ์์ด์ ์ ๋ POCO ViewModel ์คํ์ผ๋ก ์๊ธดํ๊ฒ ์ฌ์ฉํ์์ต๋๋ค.
์ค์ ๋ก CommunityToolkit์๋ .NET 5 ํ๊ฒํ ๋น๋๊ฐ ์์ด์ .NET Standard 2.0 ํ๊ฒํ ๋น๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
christian289/dotnetconfmini2205: .NET Conf Mini 22.05 ๋ฐํ ์๋ฃ ๋ฐ ์์ ์ฝ๋ (github.com)
@์์ค_ํฉ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
POCO๋ ์ฒ์ ๋ณด๊ฒ ๋์๋๋ฐ, Framework์์ ์์ค์ ๋ค๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ข์ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!
๊ด์ฌ๊ฐ์ ธ์ฃผ์ ์ ๋๋ฌด ๊ฐ์ฌํฉ๋๋ค! ์ค๋ช ์ด ๋๋ฝ๋ ๋ถ๋ถ ์ํด ๋ถํ๋๋ฆฝ๋๋ค. ์ก์์ค์ด๋ผ ์ ๊น ์์์ ํ์๋ฅผ ์น ์งฌ์ด ์๋ฉ๋๋ค. ^^; ์กฐ๋ง๊ฐ ๋ถ์ฐ์ค๋ช ์ ๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
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 ๊ธฐ๋ฅ์ ์ข ๋ ์ง๊ด์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด ๋์๋๋ฐ, ํด๋น ๋ถ๋ถ์ ์์ค ๋ด๋ถ์ ์์ ๋ฅผ ์ฐธ์กฐํด ์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก ๊ธฐ๋ฅ์ด ์๋ฒฝํ์ง๋ ์์ผ๋ฏ๋ก ํ์ํ ๊ธฐ๋ฅ์ด ์์ ๋ ์ ์ ํ ์ด์ ๋ถ์ฌ์ ์ฌ์ฉํ์๋ฉด ๋ง์ถคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.(์์ง๊น์ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์์ ํฐ ๋ฌธ์ ๋ ๋ฐ๊ฒฌ๋์ง ์์์ ์ ๋ ์ค๋ฌด์์ ์ฌ์ฉ ์ค์
๋๋ค. )
๋ต๋ณ์ด ๋ฆ์์ต๋๋ค. ํด์ผ์ด ๋๋ฉด ์๊ฐ์ด ์ข ์๊ธธ ์ค ์์๋๋ฐ, ๋ ์ ์ ์๋ค์.
์ ๋ MVVM์ ํ์ํ ์์ค์ฝ๋๋ฅผ ์๋น์ ์ค์ฌ์ค๋ค๋ ์ ์ ์ด์ ์ ์ฌ์ฉํด๋ณธ ์ ์ ๋ก์จ ๋์ํฉ๋๋ค.
์ ๊ฐ dxmvvm์ ์ด์ฉํ๋ ์์ ์ .NET 5๊ฐ ์ถ์๋์์ ์งํ ์์ง๋ง, .NET 6๊ฐ ๋์ค๋ฉด์ Source Generator๋ฅผ ํ์ฌํ MvvmLight์ ๊ณ์น์ธ CommunityToolkit.Mvvm์ MS์์ ๊ณต์์ง์ํ๋ฉด์ ์์ฐ๊ฒ ๋์๋๋ฐ์.
ํน์ ๊ณ์ ์ฌ์ฉํ์๋ฉด์ CommunityToolkit.Mvvm์ ๋นํด์ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ถ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์์๊ฒ ์ง๋ง POCO ViewModel ํํ๋ Runtime ์์ ๋๋ฒ๊น ํ ๋ ์กฐ์ฌ์์ ํ์ธํด๋ณด๋ฉด pocoviewmodel๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค์ ํ์ ๋ค์ ์ด์ํ hash ๊ฐ ๋น์ทํ๊ฒ ๋ถ์ด์์ด์ ๋ณด๊ธฐ์ ์กฐ๊ธ ์ง์ ๋ถํด์ ๋ณด๊ธฐ ์์ข์๋ ๊ฒฝํ์ด ์์์ต๋๋ค.
dxmvvm๊ณผ์ ๋น๊ต๋ฅผ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ์ ์์งํ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ ๋ง์๋๋ฆฐ๋๋ก ๋ท๋ท ํ๋ ์์ํฌ (+ํ์ฌ์์ ์ฌ์ค ๋ฐ๋ธ์ต์คํ๋ ์คโฆ) ์์
ํ๊ฒฝ์์์ ๋์์ ์ฐพ์ ๋ณธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ถ๋ค์ ํ๊ฒฝ์ ๋ฐ๋ผ์ ์ ์ ํ ๊ธฐ์ ์ ์ ํํด ์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ๋ค์! ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ตณ์ด ๋น๊ต๋ฅผ ํ์๋ฉด, ๋ฐ๋ธ ์ต์คํ๋ ์ค์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ MIF ๊ธฐ๋ฅ๋ค์ด ๊ฝค ๊ด์ฐฎ์์ ์ปจํธ๋กค๋ณ ๋ชจ๋ํ๋ฅผ ๊ณ ๋ฏผํ๋ ํ๊ฒฝ์์๋ CommunityToolkit.Mvvm์ ๋ํด ํ๋ฆฌ์ฆ์ ์ถ๊ฐํ์ง ์์๋ DevExpress.Mvvm ํ๋๋ก ํต์ผ์ฑ์๋ ์์
์ด ๋๋ค๋ ํธ๋ฆฌํจ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ง ์ฐธ์กฐ ์๋ฃ ์์ฒด๋ ๋๋ถ๋ถ์ด CommunityToolkit.Mvvm ๊ธฐ๋ฐ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์์
ํ๊ฒฝ์ ์ ํํ์ค ์ ์๋ ์ํ๋ผ๋ฉด ์๋ฃ๊ฐ ๋ง์ ์ชฝ์ ์ ํํ๋ผ๊ณ ๊ถํ๊ณ ์ถ์ต๋๋ค.
POCO ViewModel์ ์์ฑํ๋ฉด์ ์์์ ๊ตฌํํ ๋ ํด๋์ค ์ด๋ฆ์ ๋์ ์ผ๋ก UUID๊ฐ ๋ถ๋ ๊ฒ์ ๊ธฐ๋ฅ์ ์ผ๋ก ํน๋ณํ ๋ถํธํ์ง๋ ์์์ต๋๋ค.