์์ ์ ๊ณต์ ๋ฐํ๋ฅผ ์ฝ์์ ๋ MVU๋ก ํ์๋ ๋ด์ฉ์ ๋๋์ต๋๋ค.
readonly State<int> count = 0;
[Body]
View body() => new StackLayout
{
new Label("Welcome to .NET MAUI!"),
new Button(
() => $"You clicked {count} times.",
() => count.Value ++)
)
};
๋ด๊ฐ ์๋ ํ ์ด๊ฒ์ MVU๊ฐ ์๋๋๋ค . ๋๋ ์ด๋ฏธ ์ฌ๊ธฐ ์ ์ ๊ทธ๋ ๊ฒ ์๊ฐ ํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ ์ ์ ์์ต๋๋ค .
๋ด๊ฐ ์๊ธฐ๋ก๋ Xamarin.Forms ์์ MVU๋ฅผ ๊ตฌํํ๊ณ ๋์ค์ Fabulous ๊ฐ ๋ ๊ฒ์ ๊ตฌ์ถํ๋ ๋ฐ 2018๋ ๋ช ๋ฌ์ ๋ณด๋ธ Don Syme ๋ ์ข ๋ ์ธ๊ต์ ์ด์ง๋ง ๊ฒฐ๋ก ์ ๋์ผํฉ๋๋ค.
๊ทธ๋์, ๋ด ์์ ์ ๋ฌด์์ ๋๊น?
๊ฑด๋ฐฐ!
@aspnetde ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์์ผ๋ก 18๊ฐ์ ์ ๋ ๋์ ์ด ์์ด๋์ด๋ฅผ ๊ตฌํํ๋ ์์ ์
.NET MAUI ๊ฐ ์์ง ์ค์ ๋ก ๋น๋ ๋์ง ์์๊ธฐ ๋๋ฌธ์ .NET MAUI๊ฐ MVU์ธ์ง ์๋์ง ๋งํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. :)
์, ํ๋กํ ํ์ ์ด ์์ต๋๋ค. ๋ค, Comet ์คํ์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ๋ณด์ฌ์ค ๊ฒ์ด MVU์ ๋ํ ๋ชจ๋ ์ฌ๋์ ์ ์์ ์ผ์นํ์ง ์๋๋ค๋ ์ฐ๋ ค๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ด ํฌ๋ง์ ์ฐ๋ฆฌ๊ฐ ํ๋ ฅํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค! ์ฐ๋ฆฌ๊ฐ ์ต์ข ์ ์ผ๋ก ๋์์ธํ๊ณ ๋ฐฐ์กํ๋ ๊ฒ์ด ๋ค๋ฅธ ๋ผ๋ฒจ์ ๋ฐ์ ์๊ฒฉ์ด ์๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ ํ๋๋ฅผ ๋ถ์ฌํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
.NET MAUI์์ C# MVU๋ฅผ ์ด๋ป๊ฒ ๋ณด๊ฒ ๋ ๊น์?
ํ์ํ๋ค๋ฉด ์ด๋ค ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด ํ์ํ ๊น์?
Fabulous ๋ฐ/๋๋ C#๊ณผ F# ๊ฐ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ํจํด์ ๋ฌด์์ด๋ฉฐ ๋ฌด์์ด ๋ฌ๋ผ์ผ ํฉ๋๊น? ํตํฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๊น?
.NET MAUI์์ C# MVU๋ฅผ ์ด๋ป๊ฒ ๋ณด๊ฒ ๋ ๊น์?
C# MVC ๋๋ C# MVVM์ด๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์ด ์์ต๋๊น? _Model-View-Update_ aka _The Elm Architecture_๋ ์ธ์ด ์ข ์ ๊ตฌํ์ด ์๋๋ผ ์ ์ ์๋ ์ํคํ ์ฒ ํจํด์ ๋๋ค.
ํ์ํ๋ค๋ฉด ์ด๋ค ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด ํ์ํ ๊น์?
๋ฐ๋ผ์ C# 9๋ ์ฌ์ ํ F#๋ณด๋ค ์๋๋ฝ์ง๋ง ํ์ฌ์ ๊ด์ ์์ ๋ณด๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
Fabulous ๋ฐ/๋๋ C#๊ณผ F# ๊ฐ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ํจํด์ ๋ฌด์์ด๋ฉฐ ๋ฌด์์ด ๋ฌ๋ผ์ผ ํฉ๋๊น? ํตํฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๊น?
์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ MVU ์์ฒด๊ฐ ์ํคํ ์ฒ ์คํ์ผ ๋๋ ์ฑ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ๊ณผ ๊ฐ์ด ์ ์ฒด ์ ๊ทผ ๋ฐฉ์์์ ํนํ ์ธ์ด๋ณ ํญ๋ชฉ์ด ์์ด์ผ ํฉ๋๋ค.
@TimLariviere ๋ ์ต๊ทผ Fabulous๋ฅผ ๋ฐ์ ์ํค๊ธฐ ์ํ ๋ช ๊ฐ์ง
๊ทธ๊ฑด ๊ทธ๋ ๊ณ : ์๋ ์ XF + C# + MVVM๊ณผ XF + F# + MVU๋ฅผ 1:1๋ก ๋น๊ตํ๋๋ฐ ๊ฒฐ๊ณผ๋ ์์ค ์ฝ๋๋ฅผ ํฌํจํ์ฌ ์ฌ๊ธฐ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
.NET MAUI๊ฐ MVU์ธ์ง ์๋์ง ๋งํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค.
MAUI๊ฐ ๊ฒฐ๊ตญ MVU๊ฐ ๋ ์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์์ ์ด๋ฏธ ๋ง์ ํผ๋์ ์ผ๊ธฐํ ๋ฐํ ๋ธ๋ก๊ทธ์ ์ํ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ์ ์๊ฐ ์์ง MVU๋ฅผ ์ค์ ๋ก ์กฐ์ฌํ์ง ์์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค. "C# MVU"์ ๋ํด ์ด์ผ๊ธฐํ๋ค๊ณ ํด์ ์ด๊ฒ์ด ๋ ๋์์ง๋ ๊ฒ์ ์๋๋๋ค.
@aspnetde ๋ฐ @forki์ ๋์ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ปค๋ฎค๋์ผ์ด์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ ์ค ๋๊ตฌ๋ MAUI/XF์ฉ ํ์ฑ์์ ์๊ฐ์ ๋ฐ์ C# DSL์ ์ญ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. .
์ด๊ฒ์ ๋ด๊ฐ ์ง์ ์ปค๋ฎค๋์ผ์ด์ ๊ณผ ๋ฌธ์ ์ ๋ํด ๊ณ์ํด์ ์ง๋ฌธํด ์จ ๊ฒ์ ๋๋ค. ์๋ง๋ ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋๋ค์ด MVVM ๋ฐ MVU์ ๊ฐ์ ๋ค์ํ ํจํด์ ๋ํด ์ฝ์ด๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฆ, MVVM ์์ MVU๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ธ์ง๋ ์ฌ์ ํ ์๋ฌธ์ ๋๋ค.
C# MVC ๋๋ C# MVVM์ด๋ผ๋ ๋ง์ ๋ค์ด๋ณธ ์ ์ด ์์ต๋๊น?
์, C# ๋๋ XAML ๋ค์ MVVM ๋๋ MVU์ ๊ฐ์ ์ํคํ ์ฒ ํจํด์ด ์ค๋ ๊ฒ์ด ์ด์ํ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๋ด๊ฐ ์ด์ผ๊ธฐํ๋ ๋ ๊ด๋ฒ์ํ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์ค์์ ํ๋ก์ ํธ ๋ด์์ ์ํ๋ ์์ ์กฐํฉ์ ํ์ฉํ ์ ์๋ค๋ ์ ์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค. ์๋๋ "C# MVVM"์ด "XAML MVVM"๊ณผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ค๋ฅด๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ์กฐํฉ์ด ๊ฐ๋ฅํ๊ณ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ์ ์ฒด์ ์ผ๋ก ์ฝ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋๋ค.
์ด ์ค๋ ๋๊ฐ .NET MAUI์์ MVU๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ ผ์ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ฌ๊ธฐ์์ ๋ ์์ฐ์ ์ธ ๋ ผ์๋ ๋จ์ผ ์ ํ ๋ด์์ ์ฌ๋ฌ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ํคํ ์ฒ ํจํด์ ๋ํด ์ด์ผ๊ธฐํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฌด์์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ๋ ์ด๋ธ์ ์ง์ ํ๋ฉฐ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒ์ด ์ฌ๊ธฐ์์ ๋๋ถ๋ถ์ ์๊ฒฌ์ ๋ฐฉํฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ง์ ์์ฌ์ํต์ ํ๊ณ ์๊ณ ๋ด๊ฐ ์ค์ ๋ก ๋ช ํ์ฑ์ ์ถ๊ฐํ๊ณ ํผ๋์ ์ผ์ผํค์ง ์๋์ง ํ์ธํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ์ง์ฌ์ผ๋ก ํ์ํฉ๋๋ค.
์ปค๋ฎค๋ํฐ์์ ์ด๋ฏธ ๋ง์ ํผ๋์ ์ผ๊ธฐํ ๋ฐํ ๋ธ๋ก๊ทธ์ ์ํ์ ๊ดํ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ด ๋ธ๋ก๊ทธ์ ๋ํ ๋์ ๊ณตํ์ด์๊ณ ๊ทธ๊ฒ์ด ๋น์ ์ ์ํด ๋ง๋ ํผ๋์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. Elm๊ณผ @aspnetde ์ ๋ธ๋ก๊ทธ์ ๋งํฌ๋ฅผ ์ถ๊ฐํ์ฌ "์ด๊ฒ์ด ๋ฐ๋ก MVU์ ๋๋ค"๋ผ๊ณ ์๋ชป ๊ณ์ฐํ์ผ๋ฉฐ ๊ธฐ์กด MVU ๊ฒฝํ๊ณผ ๊ธฐ๋๊ฐ ์๋ ๋ถ๋ค์๊ฒ ์ฝ๋ ์กฐ๊ฐ์ด ์ผ๋ง๋ ๋ง์ ๋น์ค์ ์ฐจ์งํ ์ง ์์ํ์ง ๋ชปํ์ต๋๋ค. ์ฌ๊ธฐ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง/์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํด.
๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ์ ์๊ฐ ์์ง MVU๋ฅผ ์ค์ ๋ก ์กฐ์ฌํ์ง ์์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ฃผ์ ์ ๋ํด ๊ด๋ฒ์ํ ๋ํ์ ํ ๋ก ์ ํ์ต๋๋ค. ๊ฐ์ ํ์ง ๋ง์ญ์์ค. ์ ๋ ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ธ์ง ๋จ์ ์์ต๋๋ค.
@dersia ํด๊ฒฐํด์ผ ํ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๊ฐ๋ฐ์์๊ฒ ์ ํ๊ถ์ ์ฃผ๋ ๊ฒ์ ๋๋ค. MVVM ์์ ์๋ MVU๊ฐ ๋ฌด์์ ํด๊ฒฐํ๋์ง ๋ฌป๋๋ค๋ฉด ๋๋ ์ ํ ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๊ตฌ๋๊ฑฐ๋ ์ฐ๋ฆฌ๊ฐ ํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋๋๋ค.
#28 ๋ฐ #66์์ ์ ์๋ ๋ฆฌํฉํ ๋ง์ ๋ถ๋ถ์ ์ผ๋ก ๋ ๋๋ฌ ๊ตฌํ์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฐ MVVM ๊ด๋ จ ์ฌํญ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ฏ๋ก MVU๋ฅผ ์ ํํ๋ฉด MVVM์์ ์ฌ์ฉ๋๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
์ฝ๋ ์กฐ๊ฐ์ด ์ผ๋ง๋ ๋ง์ ๋ฌด๊ฒ๋ฅผ ๊ฒฌ๋์ง ์์ํ์ง ๋ชปํ์ต๋๋ค.
๊ทผ๋ฐ ์ ๊ณ ๊ธฐ ๋ง์ฃ ? ๊ทธ๋ฆฌ๊ณ ๋ผ๋ฒจ๊ณผ ์ผ์นํ์ง ์์ ์ฃ์กํฉ๋๋ค.
@davidortinau
์ฐ๋ฆฌ๊ฐ ๋ฌด์์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ๋ ์ด๋ธ์ ์ง์ ํ๋ฉฐ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒ์ด ์ฌ๊ธฐ์์ ๋๋ถ๋ถ์ ์๊ฒฌ์ ๋ฐฉํฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ง์ ์์ฌ์ํต์ ํ๊ณ ์๊ณ ๋ด๊ฐ ์ค์ ๋ก ๋ช ํ์ฑ์ ์ถ๊ฐํ๊ณ ํผ๋์ ์ผ์ผํค์ง ์๋์ง ํ์ธํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ์ง์ฌ์ผ๋ก ํ์ํฉ๋๋ค.
์ ์ชฝ์์ ์ถ๊ฐํ ๋ด์ฉ์ด ๋จ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ์ ์ฅ์ ๋ช ํํ๊ฒ ํํํ ๊ฒ ๊ฐ์์ :-). MVU๋ฅผ ๊ตฌํํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ฆฐ ๋ฌธ์ ๋ฐ๊ณ ๋๊ฐ ๊ฒ์ ๋๋ค. ๋ฐํ ๊ฒ์๋ฌผ๊ณผ Comet ์ ์ฅ์์ ์ค๋ํซ์ ๋ณด๊ณ ์ถ์ธกํ ์ ์๋ ๋ด์ฉ์ด๋ผ๋ฉด ์์ ๋กญ๊ฒ ๊ทธ๋ ๊ฒ ํ์ญ์์ค. ๊ทธ๋ฌ๋ MVU๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ _์ ๋ฐ_ ์ค์งํ์ญ์์ค.
๊ฐ์ฌ ํด์.
Don์ด ์ด ์ค๋ ๋์์ ์ธ๊ธ๋์๋ฏ์ด :-) - CC: @dsyme
์ ์ด๊ฒ์ด MVU๋ผ๊ณ ๋ถ๋ฆฌ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ํ๋ฅญํ ํจ๋ฌ๋ค์์ผ ์ ์๊ณ ์ฌ๊ธฐ์์ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ํจ๋ฌ๋ค์์ ์ ํฉํ๊ณ ํผ๋ํ์ง ์๋ ์ ์ ํ ์ฉ์ด๋ฅผ ์๊ฐํด๋ด์ง ์๊ฒ ์ต๋๊น?
@aspnetde ์์ ๋ฌด์์ด ๋จ์์ต๋๊น? ๋ง์ ๊ฒ ๊ฐ์์ :).
๋๋ ๋น์ ์ ๋
ผ๋ฌธ์ ์ผ๋ถ๋ฅผ ์ฝ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ข์ํ๋ค๊ณ ๋งํด์ผํฉ๋๋ค. ๋ํ Don Sym์์ F#์ ๋ํ ์ฑ
์ ์ฝ์์ต๋๋ค. ์ ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ข์ํฉ๋๋ค. ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ฐ๊ฒฐํ์ง๋ง ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ฐ๋
์ฑ์ ๊ฐ๋ฐ ์๋ช
์ฃผ๊ธฐ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์
๋๋ค. ์ค์ ๋ก ์ฝ๋๋ฅผ ์ฝ๋ ๋ฐ ๋ง์ ์๊ฐ์ ํ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ท๋ ์ฐ๊ธฐ ์ ์ฉ์
๋๋ค. ํ ๋ฒ ์์ฑํ ์๋ ์์ง๋ง ๊ฑฐ์ ์๋ฌด๋ ์ฝ์ ์ ์์ต๋๋ค(regexp์ ์ ์ฌ).
๊ณผ๊ฑฐ์ ํ์ฌ์์ ํ๋กํ ํ์ดํ/์ฐ๊ตฌ ์๊ฐ ๋์ Angular์ ํจ๊ป Redux๋ฅผ ์๋ํ์ต๋๋ค. ํํ ์๋ฏธ์ฌ ์ ๊ทผ ๋ฐฉ์์
๋๊น? ์์คํ ๊ฒฝํ์ด์์ต๋๋ค. ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ํํ ์ํ๊ฐ ๊ฐ์๊ธฐ ๋ณ๊ฒฝ๋ ์ ์๋ ์ ์ฒด ์คํ์ ๊ธฐ์ตํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
๋๋ ๋ถ๋ณ์ฑ์ ์ด์ ์ ์ดํดํ์ง๋ง ํ์ค ์ธ๊ณ๋ ๋ณํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๊ฐ์๊ธฐ ํ
๋๋ฒ ์ด์ ๋จธ๋ฆฌ๋ฅผ ์ฐข์ Erik Meijer์ ํ๋ ์ ํ
์ด์
์ ๋ณด์์ต๋๋ค.
๊ทธ๋์ ์ ๊ฐ ์ง์ ํ๊ณ ์ถ์ ๊ฒ์: ์ฐ๋ฆฌ์ ์์ฐ์ค๋ฌ์ด ์ฌ๊ณ ๋ ์ด๋ฌํ ํจ๋ฌ๋ค์์ ๋ฐ๋๋๋ ๊ฒ์ด ์๋๋๊น? ๋น์ ์ ๊ฒฝํ์ ๋ฌด์์ ๋๊น?
์ ๋ XAML/C#/MVVM์ ๋ํ ๊ฒฝํ์ด ๋ง๊ธฐ ๋๋ฌธ์ Don Syme์ด XAML์ ๋ถํ์ํ๋ค๊ณ ์๊ฐํ๋ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค.
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ด์ฌ์ฌ(UI, ํ๋ ์ ํ
์ด์
, ๋น์ฆ๋์ค ๋ฑ ๋
ผ๋ฆฌ)๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ฌํ DSL(C# ๋งํฌ์
)๊ณผ MVU๊ฐ ์ฅ๊ธฐ์ ์ผ๋ก ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฒฝํ์ด ์๊ฑฐ๋ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๋ ์ฑ
์์ ํผํฉํ ๊ฒ์
๋๋ค. MVU ํจํด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ ค๋ฉด ๋ ๋ง์ ๊ฒฝํ์ด ํ์ํ์ง๋ง ์ด ๋ ํจ๋ฌ๋ค์์ ๋ชจ๋ ์๋ํ๊ณ ์ ์ฒด ์ปค๋ฎค๋ํฐ์ ๋งค์ฐ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ต๋ํ ๋ง์ด ๊ณต์ ํด์ฃผ์ธ์. @aspnetde ๊ฐ์ฌํฉ๋๋ค!
(๋ชจ๋) ์ดํดํด ์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
@davidortinau ์๋ง๋ ์ฌ๊ธฐ์ ์คํด๊ฐ ๋งก๊น๋๋ค . ๋๋ ๋จ์ง ์ฐ๋ฆฌ๊ฐ ๋ฌผ๊ฑด์ ์ด๋ฆ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ด์ผ ํ๋ค๊ณ ๋งํ๋ ค๊ณ ํ์ ๋ฟ์ ๋๋ค. ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ถ์ผ์ ๋ชจ๋ ์ฌ๋๋ค์ ์ด๋ฆ์ ์ง๋ ๊ฒ์ด ๊ฐ์ฅ ์ด๋ ค์ด ์ผ ์ค ํ๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ด๋ฏธ ์ด๋ฆ์ด ์ ์ ์๋ ๊ฒ์ด ์๋ค๋ฉด ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋ํด ๊ทธ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ์ง ๋ง์์ผ ํฉ๋๋ค.
Miss Communication ์๋ชป๋
์ด ๊ฒฝ์ฐ ์๋ชป๋ ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด ์ด ํ๋ก์ ํธ์์
) MVU๊ฐ ์ฌ๊ธฐ์ ๋งํ๋ ๋ด์ฉ์ ์๋ชป๋ ์ด๋ฆ์์ ์ดํดํฉ๋๋ค.
b) ์ฌ๊ธฐ์์ ์ค์ ํ๋ ค๋ ๊ฒ์ ์ค๋ช
ํ๋ ์ฌ๋ฐ๋ฅธ ์ฉ์ด๋ฅผ ์ฐพ๊ธฐ ์ํด
๊ทธ๋ฐ ๋ค์ c) ๋ชจ๋ ์ฌ๋์ ์
๋ฐ์ดํธํ๊ณ ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ์์ํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ ํ ๋์๊ฐ์ ๊ณ ์น ์ ์๋ ์ง์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ํฉ์๋ค. ์ผ์ด๋ ์ ์๋ ์ต์ ์ ์ํฉ์ XF/๋ง์ฐ์ด ์ปค๋ฎค๋ํฐ๊ฐ MVU๋ฅผ ๋ค๋ฅธ ์ธ๊ณ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์ดํดํ๋ค๋ ๊ฒ์ ๋๋ค.
์ฆ, ๋๋ MVU์ ์ด๋ ฌํ ํฌ์ด๋ฉฐ MVVM๋ ์ฌ๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Comet์์์ ๊ฐ์ด ์ ์ฐฝํ MVVM ์ ๊ทผ ๋ฐฉ์(์์ง ๋ ๋์ ์ด๋ฆ์ ์์ต๋๋ค)๊ณผ ์ง๊ธ๊น์ง ์ ์๋ ๊ฒ์ด ํ๋ฅญํ๊ณ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๊ฐ ์ง์ํ๊ณ ์ด๋ฆ์ ์์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง: ๋ฏธ์ค ์ปค๋ฎค๋์ผ์ด์ ์ด ๋ํ์์ ํ๋ฝํ์ต๋๋ค.
๋๋ ๋ถ๋ณ์ฑ์ ์ด์ ์ ์ดํดํ์ง๋ง, ํ์ค ์ธ๊ณ๋ ๋ณํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๊ฐ์๊ธฐ ํ ๋๋ฒ ์ด์ ๋จธ๋ฆฌ๋ฅผ ์ฐข๋ Erik Meijer์ ํ๋ ์ ํ ์ด์ ์ ๋ณด์์ต๋๋ค.
@tomasfabian ์ด๊ฒ์ ์๋ชป๋์์ต๋๋ค.
์ธ์์ ์ผ๋ จ์ ์ฌ๊ฑด์ผ๋ก ๋ณด๊ธฐ ์์ํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ค์ ๋ก ๊ทธ๋ ์ต๋๋ค(์ฌ๊ธฐ์ ์ด๋ฒคํธ ์์ฑ ๋
ผ์๋ฅผ ์์ํ๊ณ ์ถ์ง ์์ต๋๋ค).
ํ
๋๋ฒ ์ด์๊ฒ ์ผ์ด๋ ์ผ์ ๊ทธ ์ํ์ ์๋ก์ด ์ด๋ฒคํธ๊ฐ ์ถ๊ฐ๋์๋ค๋ ๊ฒ๋ฟ์
๋๋ค. ์ด ๊ฒฝ์ฐ์ ์ด๋ฒคํธ๋ "๋จธ๋ฆฌ๊ฐ ์ฐข์ด์ง" ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋๋๋ฆด ์ ์๋ค๋ ์ฌ์ค์ ์ ์ ์๋ฏ์ด ๋ฐ์ํ ์ผ์ ์คํ ์ทจ์ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๋จธ๋ฆฌ๋ฅผ ํ
๋๋ก ๋๋๋ฆฌ๋ ค๋ฉด "๋ชธ์ ๋จธ๋ฆฌ๋ฅผ ๊ฟฐ๋งค๊ธฐ"๋ผ๋ ์๋ก์ด ์ด๋ฒคํธ๊ฐ ํ์ํฉ๋๋ค. ๐
FP ๋ฐ MVU์ ์ด์ ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ ์ฌ๊ธฐ์์ ์ฃผ์ ์์ ๋ฒ์ด๋ IMHO์ ๋๋ค. ์ด ๋ฌธ์ ๋ ์๋ชป๋ ์์ฌ ์ํต๊ณผ ์ ํํ ์ด๋ฆ ์ง์ ๊ฐ๋ฅ์ฑ์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@isaacabraham ์๋ง๋ ๋น์ ์ด ์ณ์์ ๊ฒ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํด ์ฌ๊ณผํฉ๋๋ค. ์ด๊ฑด ๋ด ์๋ชป์ด์ผ. ๋ค์ด๋ฐ์ด ์ค์ํ๋ค๋ ๊ฑด ์์ง๋ง ํํธ์ผ๋ก๋ 'MVU๊ฐ ์๊ฐํ ๊ฒ๊ณผ ๋ค๋ฅผ ์๋ ์๋ค'๋ ์ ๋ชฉ์ด ๋ฌธ์ ๋ค. ๊ทธ๋์ ์ด๋ฆ ์ง๋ ๊ฒ๋ณด๋ค ์กฐ๊ธ ๋ ๊ด๋ฒ์ํ ์ฃผ์ ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ณ ๋ง์์, ํ ๋ง์ค
@tomasfabian MVU, FP ๋๋ ๊ทธ ๋ฐ์ ๋ชจ๋ ๊ฒ์ ์ฅ๋จ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ์ค์ ๋ ๊ฐ์์ด๋ ๐ ์ด๊ฒ์ด ์ ์ ํ ํฌ๋ผ์ด๋ผ๊ณ ์๊ฐํ์ง ๋ง์ญ์์ค.
@davidortinau
์ธ์ด ๊ธฐ๋ฅ ๋ฐ ์ํคํ
์ฒ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์์ด ๋ ์ ์๋ ํ ๋ค์๊ณผ ๊ฐ์ ์ ์์ ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
* new
ํค์๋ ๋ฐ ๊ธฐํ ๊ตฌ๋ฌธ ๋
ธ์ด์ฆ.
Dart๋ Kotlin๊ณผ ๋ฌ๋ฆฌ C#์๋ ํ์ new
ํค์๋๊ฐ ์์ํ ๋ถ์ด ์์ ์ ์์ต๋๋ค. ์ ํ ์ฌํญ์ผ๋ก ๋ง๋๋ ๊ฒ์ ํ์ผ๋ณ ์ตํธ์ธ ์ง์๋ฌธ์ผ๋ก๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด์ ์ธ๊ธฐ ์๋ ์ ์์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ๊ทธ ๋์ ์ ์ต์ํ ํต์ฌ ์งํฉ์ ๋ํด ์์ฑ์๋ฅผ ๋ํํ๊ณ ์ด๊ธฐํ ์ ์ฉ ์์ฑ(์๋ ๊ฒฝ์ฐ)์ ์ด๊ธฐํํ๋ ์ ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ ๊ณต์(์ ์ง ๊ด๋ฆฌ๋๋) ์ ์ ํด๋์ค(๋๋ MAUI ๋ทฐ ๋ค์์คํ์ด์ค๋น ์ ์ ํด๋์ค)๊ฐ ์์ ์ ์์ต๋๋ค. MAUI ๋ณด๊ธฐ ๊ฐ์ฒด. ๊ทธ๋ฐ ๋ค์ ๋ทฐ ์ฝ๋ .cs ํ์ผ์ ๋งจ ์์ using static
์ง์๋ฌธ์ ๋ฃ์ ๋ค์ new
๊ตฌ๋ฌธ ๋
ธ์ด์ฆ ์์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด C# ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ์ด์์ ํจ๊ณผ ๋
ธ์ด์ฆ๊ฐ ์ฝ๊ฐ ์ค์ด๋ญ๋๋ค. ๋ฌผ๋ก ์ด๋ฌํ ์ ์ ๋ฉ์๋ ์์ฑ์ ๋ํผ๋ ์ปค๋ฎค๋ํฐ์์ ์๋ ์์ฑํ ์ ์์ง๋ง(Xamarin.Forms๊ฐ CSharpForMarkup๊ณผ ํจ๊ป ์ฌ์ฉํ๋๋ก ๋น์ทํ ์์
์ ์ํํ์ต๋๋ค.) MAUI ํ๋ก์ ํธ.
๋ํ MVU/Comet/CSharpForMarkup ๋ณด๊ธฐ ํจ์์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ฒ๋ผ ํฐ ํํ์ ํธ๋ฆฌ์์ ๊ตฌ๋ฌธ ํผ๋์ด๋ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ C# ์ธ์ด ์ ์์ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. C#9๋ MVU์ M ๋ฐ U ๋ถ๋ถ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ด์ ๊ด๋ จํ์ฌ ๋จผ ๊ธธ์ ๊ฐ์ง๋ง V ๋ถ๋ถ์ ์ฌ์ ํ โโ๊ตฌ๋ฌธ์ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค.
* ํ์ฅ ์์ฑ *
"extension-everything" ์ ์์ด ํ์ฌ ๋ณด๋ฅ ์ค์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง MVVM-with-C#-markup(์: Xamarin.Forms๊ฐ ์๋ CSharpForMarkup)์ ๋์์ด ๋ ์ ์๋ ํ ๊ฐ์ง๋ ํ์ฅ ์์ฑ์
๋๋ค. CSharpForMarkup์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๋์ฐ๋ฏธ๋ ํ์ฅ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ์ฅ ์์ฑ(๊ฐ์ฒด ์ด๋์
๋ผ์ด์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ)์ด ํจ์ฌ ๋ ์ข์ ๋ณด์
๋๋ค.
// Instead of this:
public View Body() =>
new Widget() {
BuiltInProperty = "initial value",
}.SetExtensionProperty("initial value");
// the extension property could be included in the object initializer:
public View Body() ->
new Widget() {
BuiltInProperty = "initial value",
ExtensionProperty = "initial value",
};
์ด๋ ๋งํฌ์ ์ฉ C#์ด ์๋ MVVM์์์ ๊ฐ์ด ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ทฐ ๊ฐ์ฒด ํธ๋ฆฌ์๋ง ์ค์ ๋ก ์ ์ฉ๋ฉ๋๋ค. MVU ๋๋ ๊ธฐํ ๊ธฐ๋ฅ์ UI ์ํคํ ์ฒ์ ๊ฒฝ์ฐ ๋ทฐ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ์ ์ฐฝํ ํ์ฅ ๋ฐฉ๋ฒ์ด ๋ ์ ํฉํฉ๋๋ค.
* ์ํ ๊ด๋ฆฌ์ ๋ํด ๋ ๋
๋จ์ (๋๋ ์ํ๋ ๊ฒฝ์ฐ ๋ฎ์ ์์ค)์ ์ ์งํฉ๋๋ค. *
Xamarin.Forms ์์ MVU๋ฅผ ๊ตฌํํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ํฐ ์ฅ๋ฒฝ ์ค ํ๋๋ ๋ ๊ฐ์ง ํ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ํ๋ซํผ๋ณ ํํ ๋ฑ...). ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์กฐ๊ฐ์ ๋ถ๋ถ diff ๋ฑ์ ์ํํ์ฌ diff๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ํฌํจํ์ฌ ๋ทฐ ํจ์์ ๋ฐํ ๊ฐ๊ณผ ๋ค๋ฅธ ๋ฐํ ๊ฐ ๊ฐ์ ์ฐจ์ด์ ์ ์ฐพ์ ํค๋น๊ธ ํ๋ซํผ๋ณ ๋ทฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ diffing ์์ง์
๋๋ค...
MAUI๊ฐ ์ด์ ์ด ๋ ๊ฐ์ง ํ์ ์์๋ฅผ ์ ๊ณตํ๋ ๊ฒ ๊ฐ๊ตฐ์. ํ๋ฅญํฉ๋๋ค! ๊ทธ๋ฌ๋ MVU ์ปค๋ฎค๋ํฐ์ ์ผ๋ถ๊ฐ MVU ๋๋ ์ ์ฌํ "๊ธฐ๋ฅ์ " UI ์ํคํ ์ฒ๋ณด๋ค MVVM์ ๋ ๊ฐ๊น๋ค๊ณ ๋งํ๋ ๋ ๋จ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ด๋ ํ๋ฉด์ ์ผ๋ก๋ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ด๊ฐ ์ ํธํ๋ ๊ฒ์ ์์์ ์ธ๊ธํ ๋ ๊ฐ์ง ํ์ ์์(๊ฐ๋ฒผ์ด ๋ณด๊ธฐ ๊ฐ์ฒด ๊ทธ๋ํ ๋ฐ ํจ์จ์ ์ธ diffing ์์ง)๋ฅผ ์ ์งํ๊ณ MVU ๋๋ Comet์ด ์์ ํจ์จ์ ์ผ๋ก ๊ณ์ธตํ๋ ์ ์๋ ๋ ๋ฎ์ ์์ค์ ๊ตฌ์ฑ ์์ ์์คํ ๊ณผ ๊ฒฐํฉํ๋ ๊ฒ์ ๋๋ค. ์ ํ. ์ด์ฉ๋ฉด ๊ทธ๊ฒ์ด ์ด๋ฏธ ๋ชฉํ์ด๊ณ ๋ด๊ฐ ๋ณด์ง ๋ชปํ๋ ๊ฒ์ผ๊น์? ๊ทธ๋ ๋ค๋ฉด ์ต์ํ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์๋ฅผ ํตํด ์ด์ ๋ํ ๋ ๋ง์ ๋ ผ์๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
@aspnetde ์ ๊ฒ์๋ฌผ์ ์ญ์ ํ์ต๋๊น?
@tomasfabian
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด [MVVM]์ ๊ด์ฌ์ฌ(UI, ํ๋ ์ ํ ์ด์ , ๋น์ฆ๋์ค ๋ฑ)๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ค, ๊ทธ๋ ์ต๋๋ค. ์ ๋ MvvmCross๋ก ๋น๋๋ ๋๊ท๋ชจ Xamarin.iOS ๋ฐ Xamarin.Android ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ข์ ๊ฒฝํ์ ํ์ต๋๋ค. ์ค๋๋ ๋๋ ํ๋ ์์ํฌ๋ณด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ์ฌ ๋ ์ ํธํ์ง๋ง, ๊ทธ ๋ชจ๋ ํ๋ก์ ํธ(์ผ๋ถ๋ 6์๋ฆฌ LOC๊ฐ ํฌํจ๋จ)๊ฐ ๊ธฐ์ ์ ์ผ๋ก๋ ๋น์ฆ๋์ค ๊ด์ ์์ ์ฑ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
MVVM์ ํนํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅํ ๋ ์ข์ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ถํํด์ผ ํ๋ ๋ชจ๋ฐ์ผ์์๋ ์ฑ์ด ์ผ์ ํฌ๊ธฐ๋ฅผ ๋์ผ๋ฉด ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ก ๋ฆฌํฉํ ๋งํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค.
์ด๋ฌํ ํจ๋ฌ๋ค์([MVU])์ ๋ํ ์ฐ๋ฆฌ์ ์์ฐ์ค๋ฌ์ด ์ฌ๊ณ ๊ฐ ์๋๊น์? ๋น์ ์ ๊ฒฝํ์ ๋ฌด์์ ๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. ์คํ ๋ฆฌ์ง์ฉ Redux์ ๋ํ ๊ฒฝํ์ ํ์ฉํ๊ณ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด์ ์ ํ์ฉํ ์ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ์ธ๋ป๋ณด๊ธฐ์๋ ๋ ๋ณต์กํด ๋ณด์ด์ง๋ง ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ดํดํ๊ณ ์์ ํ๋ ๊ฒ์ด ํจ์ฌ ๊ฐ๋จํฉ๋๋ค. @forki๊ฐ ์ข ์ข ์ง์ ํ๋ ๊ฒ์ฒ๋ผ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด ํญ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๋ช ํํ๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ง๋ฃจํฉ๋๋ค.
์ด๋ฌํ DSL(C# ๋งํฌ์ )๊ณผ MVU๊ฐ ์ฅ๊ธฐ์ ์ผ๋ก ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
MVU์ MVVM์ ์๋ก ๋ค๋ฅธ ์ฅ์ ์ด ์์ง๋ง ๋ ๋ค ์๋ก ๋ค๋ฅธ ๋จ์ ๋ ์์ต๋๋ค.
MVVM ํ๋ก์ ํธ๊ฐ ์ฑ๊ณต์ ์ด์์์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ ํ๊ณผ ๋๋ ๋๋ฒ๊น ์ ๋ํด ๋จธ๋ฆฌ๋ฅผ ์์์ต๋๋ค. ํนํ ํ ํ๋ก์ ํธ์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ง์ ํ ๋ฐ์ ๊ฐ์ด ์๋ก์ด ํ์์ ๊ฒฝํ ๋ถ์กฑ๊ณผ ์คํด๋ก ์ธํด ๋ณต์ก์ฑ์ ๊ฒช๊ธฐ ์์ํ์ต๋๋ค. ์๊ฒฉํ๊ฒ ์ ์ฉ๋ ๋ MVU์์๋ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. ์๋ํ๋ฉด MVU๊ฐ ์๋ ๋ฐฉ์์ ๊ฒฝ๊ณ๋ฅผ ๋๋ฌด ์ข๊ฒ ์ ์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๊ฒฝ๊ณ๋ฅผ ๊นจ๊ณ ๋ค๋ฅธ ๋ฐฉ์๋ณด๋ค ์๋ชป๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋๋ค.
MVU์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ: ์ค์ผ์ผ๋ง. ๋ง์ ์ฌ๋๋ค์ด ๋จ์ผ ํ๋ก๊ทธ๋จ์ ์ง์งํ๊ณ ์์ต๋๋ค. ์ ๋ ์ฌ๊ธฐ์ ํ์์ ์ ๋๋ค(์ฌ๋ฌ ํ๋ก๊ทธ๋จ/๋ชจ๋์ด ๋ ๋์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค). ๋ ๋ฒ์งธ: ๋ฐ๋ก ์ง๊ธ Fabulous์ ๊ฐ์ ๊ฒ์ด Xamarin.Forms ์์ ์์ต๋๋ค. ๋ฐ๋ผ์ iOS/Android ์์ ์๋ ์ถ์ํ ๊ณ์ธต ์์ ์๋ ์ถ์ํ ๊ณ์ธต ์์ ์๋ ์ถ์ํ ๊ณ์ธต์ ๋๋ค. ์์ฒญ๋ ๋ณต์ก์ฑ์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฌด๋ ์ ๊ฒฝ ์ฐ์ง ์๋ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ถ์ํ ๊ณ์ธต(Xamarin.Forms)์ด ๋ณ๊ฒฝ๋ ๋ ํ๋์ ์ถ์ํ ๊ณ์ธต(Fabulous)์ ์ ๋ฐ์ดํธํ๋ ๊ฒ๋ ๋ค์ ์ง๋ฃจํ๊ณ ๋ถ์พํ ์์ ์ ๋๋ค.
๊ทธ๊ฒ์ด ๋ด๊ฐ MAUI์ ๋ํ ํฐ ๊ธฐํ๋ฅผ ๋ณผ ์ ์๋ ๊ณณ์ ๋๋ค. ์ ๋ ์์งํ Fabulous ๋ฉ์ธํ ์ด๋๋ค์ด ์ฌ๊ธฐ์์ Microsoft์ ํ์ ํฉ์น๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์กฐ์ง์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ๊ณผ๊ฑฐ์ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ Microsoft๊ฐ ๊ทธ๊ฒ์ ๋ง์น์ง ์๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋๋๋ค.
๋๋ง
์์ ์ ๊ณต์ ๋ฐํ๋ฅผ ์ฝ์์ ๋ MVU๋ก ํ์๋ ๋ด์ฉ์ ๋๋์ต๋๋ค.
readonly State<int> count = 0; [Body] View body() => new StackLayout { new Label("Welcome to .NET MAUI!"), new Button( () => $"You clicked {count} times.", () => count.Value ++) ) };
๋ด๊ฐ ์๋ ํ ์ด๊ฒ์ MVU๊ฐ ์๋๋๋ค . ๋๋ ์ด๋ฏธ ์ฌ๊ธฐ ์ ์ ๊ทธ๋ ๊ฒ ์๊ฐ ํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ ์ ์ ์์ต๋๋ค .
๋ด๊ฐ ์๊ธฐ๋ก๋ Xamarin.Forms ์์ MVU๋ฅผ ๊ตฌํํ๊ณ ๋์ค์ Fabulous ๊ฐ ๋ ๊ฒ์ ๊ตฌ์ถํ๋ ๋ฐ 2018๋ ๋ช ๋ฌ์ ๋ณด๋ธ Don Syme ๋ ์ข ๋ ์ธ๊ต์ ์ด์ง๋ง ๊ฒฐ๋ก ์ ๋์ผํฉ๋๋ค.
๊ทธ๋์, ๋ด ์์ ์ ๋ฌด์์ ๋๊น?
- C#์ด๋ F#์ด๋ ์๊ด์์ด ์ค์ ์ํคํ ์ฒ ํจํด์ ๊ตฌํํ์ผ๋ฉด ํฉ๋๋ค. Fabulous ๋ค์ ์๋ ์ฌ๋๋ค์๊ฒ ๋ค๊ฐ๊ฐ๋ ๊ฒ์ด ์ฌ๊ธฐ์์ ์์๋ ์ ์์ต๋๋ค.
- ๊ทธ๊ฒ์ ๊ด์ฌ์ด ์์ง๋ง ํ์ฌ Comet ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ํ ๋ช ํํ ๋น์ ์ด ์๋ค๋ฉด ํด๋น "์ฑ ๋ชจ๋ธ"์ ๋ ์ ์ ํ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ก์ด ๊ฒ์ ๋ฐ๋ช ํ์ญ์์ค. ์ด๋ฆ์ MSMVU๋ก ์ง์ ํฉ๋๋ค. ๋ฌด์์ด๋ . ๊ทธ๋ฌ๋ ์ค๋ ์ง๋ฅผ ์ํด ์ฌ๊ณผ๋ฅผ ํ์ง ๋ง์ญ์์ค.
๊ฑด๋ฐฐ!
์ ์ด๋ฆ์ MSMVU๋ก ์ง์ ํ ๊น์? ํ์ฑ์ MVU์์ผ๋ฉฐ ์์ผ๋ก๋ ๊ทธ๋ด ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฐ์ด๋ MVU์ ๋๋ค.
.NET MAUI๊ฐ MVU์ธ์ง ์๋์ง ๋งํ๊ธฐ์๋ ๋๋ฌด ์ด๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค.
MAUI๊ฐ ๊ฒฐ๊ตญ MVU๊ฐ ๋ ์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์์ ์ด๋ฏธ ๋ง์ ํผ๋์ ์ผ๊ธฐํ ๋ฐํ ๋ธ๋ก๊ทธ์ ์ํ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ์ ์๊ฐ ์์ง MVU๋ฅผ ์ค์ ๋ก ์กฐ์ฌํ์ง ์์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค. "C# MVU"์ ๋ํด ์ด์ผ๊ธฐํ๋ค๊ณ ํด์ ์ด๊ฒ์ด ๋ ๋์์ง๋ ๊ฒ์ ์๋๋๋ค.
๊ทธ๊ฒ์ ์ด๋ค ํผ๋๋ ์ผ์ผํค์ง ์์ต๋๋ค. ์ผ๋ถ ์ฌ๋๋ค์ C#์ด MVU๋ฅผ ์ํํ๋ ๊ฒ์ ๋ณด๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ SwiftUI(Comet์ด ๋๋ถ๋ถ์ ์๊ฐ์ ์ป์)๋ ๋ช
์์ ์ธ ์ง์นจ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ํจํด์ MVVM์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
ํ์ง๋ง MVU์ ๋ํ ์ธ๊ธ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
@TimLariviere https://github.com/Clancey/Comet#key -concepts
๊ธฐ๋ณธ์ ์ผ๋ก Comet์ ๊ทธ๊ฒ์ MVU๋ผ๊ณ ๋ถ๋ ๊ณ ์ด๋ฏธ MVU์ ์ด์ ์ ์์ ์๋ ๋ฉ์์ง ๋ฃจํ์ ์์ ์ ๋์น๊ณ ์์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ SwiftUI(Comet์ด ๋๋ถ๋ถ์ ์๊ฐ์ ์ป์)๋ ๋ช ์์ ์ธ ์ง์นจ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ํจํด์ MVVM์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ด ๊ฒ์๋ฌผ์ ์์ ๋ถ๋ถ์ ์๋ ์์ ๋ฅผ ๋ณด๋ฉด ํ๋ฆฌ์ง ์์ต๋๋ค. https://nalexn.github.io/clean-architecture-swiftui/
ํ์ง๋ง MVU์ ๋ํ ์ธ๊ธ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๋์ผํ ๊ฒ์๋ฌผ์์๋ ์ด์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ค๋ช ํฉ๋๋ค(SwiftUI + Redux = TEA์ ์กฐํฉ์ผ๋ก). ์ดํ "Clean Architecture"๋ก ์ด์ํ๊ฒ ์ ํ๋๊ณ ์์ง๋ง ๐
์ฌ๊ธฐ์์ ์ธ๊ธ๋์์ผ๋ฏ๋ก ๋ช ๊ฐ์ง๋ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
MAUI๋ ํ๋ฅญํ๊ณ ์ํคํ ์ฒ๋ก์์ MVU์ ๋ํด ๋ฐฐ์ฐ๋ ๊ฒ์ ์ฌ๋๋ค์ด MAUI๋ฅผ ์ดํดํ๋ ๋ฐ ์ ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋จ์ด์ ์ฝ๋งค์ด๊ธฐ ์ฝ๊ณ , ์ด ๋จ๊ณ์์ ์ฐ๋ฆฌ ๋ชจ๋ ์จ์ ์ฌ๊ณ ๊ฑฑ์ ํ์ง ์์ผ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ์ฌ์ฉ๋๋ ๋จ์ด๋ฅผ ์กฐ์ ํ ์๊ฐ์ด ์ถฉ๋ถํ๊ณ ์ ํํ ์ฉ์ด์ ๋ํ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์๋ค. ๊ฐ์ธ์ ์ผ๋ก Elm์ "MVU"์ ๊พธ๋ฐ์ด ์๊ณ ํ์ ๋์ง ์์ ์ฌ์ฉ์ด ๋ช ์์ ๋ฉ์์ง, ๋ช ์์ ์ ๋ฐ์ดํธ, ๊ธฐ๋ฅ์ ๋ชจ๋ธ, ๊ธฐ๋ฅ์ ๋ทฐ ์ฌ๊ณ์ฐ ๋ฐ ์ฐจ๋ฑ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฏธํ๋ค๋ ๊ฒ์ ํ๋ฆฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ MVU ์๋ ๋ง์
๋๋ ์ฌ๋๋ค์ด ์ด ๋ถ์ผ์ ๋ํด ๋งค์ฐ ๊ฐํ ์ ๋ ๊ณผ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝํฅ์ด ์๊ณ ๋งค์ฐ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ผ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด๋ค ๊ฒ์ธ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋์์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณต๊ฐ์ ๋ชจ๋ ์ง์ ์๋ ์ฅ๋จ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฅํ ์ต๊ณ ์ ๊ธฐ์ ์ ๋ง๋ค๊ธฐ ์ํด ๋ชจ๋ ์ฌ๋์ด ํจ๊ป ์๋ํ๊ณ , ์ฌ์ฉํ๊ณ , ๋ฐฐ์ฐ๊ณ , ๊ณต์ ํ๊ณ , ํ๋ ฅํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
@dsyme
Comet/MAUI ์ํคํ
์ฒ์ ๋ํ ์ ์ ํ ์ฉ์ด๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(๋๋ UDF)์ ๋ณํ์ด์ง๋ง MVU ์์ฒด๊ฐ UDF์ ๋งค์ฐ ํน์ ํ ๋ณํ์ด๊ธฐ ๋๋ฌธ์ MVU๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. MAUI/Comet์ ํ์คํ UDF ํ๋ ์์ํฌ๋ก ์ ํฉํ์ง๋ง(SwiftUI์ ๋ง์ฐฌ๊ฐ์ง๋ก) MVU ํ๋ ์์ํฌ๋ก๋ ์ ํฉํ์ง ์์ต๋๋ค. UDF์๋ MVU, Flux, Redux, React ๋ฑ ์ฌ๋ฌ ๋ณํ์ด ์์ง๋ง MVU๊ฐ ์ ํ ์๋ ๋ Comet MVU๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋ชป๋ ์์ฌ์ํต์
๋๋ค.
MVU์ ๋ฌ๋ฆฌ Model์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ฉฐ View ํจ์์ ์ฝ๋์ ์ํด ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋์ฐ๋ณ์ด๊ฐ ๊ด์ฐฐ๋๊ณ ๋ทฐ๋ ๋ค์ ๋ ๋๋งํ์ฌ ์ด๋ฌํ ๋์ฐ๋ณ์ด์ ๋ฐ์ํฉ๋๋ค. ๋ทฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋จ๋ฐฉํฅ์ด์ง๋ง ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ, ๋ฉ์์ง ๋ฐ ๋ฉ์์ง ๋์คํจ์นญ์ด ์์ผ๋ฏ๋ก MVU๊ฐ ์๋๋๋ค. MVVM์ ๋จ๋ฐฉํฅ ๋ณํ์ ๊ฐ๊น์ต๋๋ค.
@JeroMiya ๊ฐ์ฌํฉ๋๋ค. ํด๋น ์ฉ์ด์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ต๋๊น?
@dsyme ์ด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ธ๊ธ์ ์์ง๋ง React ์ด๊ธฐ, ํนํ React ์์ฒด์ Redux ๋ฐ Flux์ ๊ฐ์ด ๋ฑ์ฅํ ์ด๊ธฐ ํจํด ๋ช ๊ฐ์ง์ ๊ด๋ จํ์ฌ ์ฒ์ ์ฌ์ฉ๋ ์ฉ์ด๋ฅผ ๋ฃ๊ธฐ ์์ํ์ต๋๋ค. ๋ง์ UDF ๋ณํ(๋๋ถ๋ถ React ๊ณต๊ฐ์ ์์)์ ์ค๋ช ํ๋ ๊ธฐ์ฌ๋ฅผ ๊ธฐ์ตํ์ง๋ง ์ง๊ธ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฆ, ํ์ ์ํคํ ์ฒ๊ฐ ์๋๋๋ค. ๋ณด๊ธฐ๊ฐ ์ด๋ฒคํธ์ ๋ํ ์๋ต์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ํ ์ ์ฅ ๊ฐ์ฒด ํธ๋ฆฌ์ธ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ๋ชจ๋ธ์ ๊ธฐ๋ฅ์ธ ๋ณด๊ธฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ ๊ฐ๊น์ต๋๋ค. UDF ๊ฐ๋ ์ ๋ชจ๋ธ์ด ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋๋์ง ๋๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ์ง์ ํ์ง ์์ต๋๋ค. MVU๋ UDF ๊ฐ๋ ์ ๋ทฐ ์์ฒด๋ฟ๋ง ์๋๋ผ ๋ชจ๋ธ ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค๊น์ง ํ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ MVU์์๋ ๋ชจ๋ธ๋ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ UI ์ํ ๋ณ๊ฒฝ์ ์ ๋ณด๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ ๋ชจ๋ธ์ ์์ฑํ๋ ๋ช ๋ น์ผ๋ก ํ์๋ฉ๋๋ค.
๋ฌผ๋ก ์๋ก์ด ๊ฐ๋ ์ ์๋๋๋ค. React ์ด์ ์๋ Asp.Net MVC, Rails, ์ฌ์ง์ด PHP์ ๊ฐ์ ๋๋ถ๋ถ์ ์๋ฒ ์ธก ์น ํ๋ ์์ํฌ๊ฐ ๊ธฐ์ ์ ์ผ๋ก ๋จ๋ฐฉํฅ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. React๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์๋ ์ฃผ๋ฅ SPA ํ๋ ์์ํฌ์ ํด๋ผ์ด์ธํธ ์ธก UI ํ๋ ์์ํฌ์์ ์ผ๋ฐ์ ์ด์ง ์์์ต๋๋ค.
@dsyme ์ด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ธ๊ธ์ ์์ง๋ง React ์ด๊ธฐ, ํนํ React ์์ฒด์ Redux ๋ฐ Flux์ ๊ฐ์ด ๋ฑ์ฅํ ์ด๊ธฐ ํจํด ๋ช ๊ฐ์ง์ ๊ด๋ จํ์ฌ ์ฒ์ ์ฌ์ฉ๋ ์ฉ์ด๋ฅผ ๋ฃ๊ธฐ ์์ํ์ต๋๋ค. ๋ง์ UDF ๋ณํ(๋๋ถ๋ถ React ๊ณต๊ฐ์ ์์)์ ์ค๋ช ํ๋ ๊ธฐ์ฌ๋ฅผ ๊ธฐ์ตํ์ง๋ง ์ง๊ธ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฆ, ํ์ ์ํคํ ์ฒ๊ฐ ์๋๋๋ค. ๋ณด๊ธฐ๊ฐ ์ด๋ฒคํธ์ ๋ํ ์๋ต์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ํ ์ ์ฅ ๊ฐ์ฒด ํธ๋ฆฌ์ธ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ๋ชจ๋ธ์ ๊ธฐ๋ฅ์ธ ๋ณด๊ธฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ ๊ฐ๊น์ต๋๋ค. UDF ๊ฐ๋ ์ ๋ชจ๋ธ์ด ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋๋์ง ๋๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ์ง์ ํ์ง ์์ต๋๋ค. MVU๋ UDF ๊ฐ๋ ์ ๋ทฐ ์์ฒด๋ฟ๋ง ์๋๋ผ ๋ชจ๋ธ ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค๊น์ง ํ์ฅํฉ๋๋ค. ๋ฐ๋ผ์ MVU์์๋ ๋ชจ๋ธ๋ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ UI ์ํ ๋ณ๊ฒฝ์ ์ ๋ณด๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ ๋ชจ๋ธ์ ์์ฑํ๋ ๋ช ๋ น์ผ๋ก ํ์๋ฉ๋๋ค.
๋ฌผ๋ก ์๋ก์ด ๊ฐ๋ ์ ์๋๋๋ค. React ์ด์ ์๋ Asp.Net MVC, Rails, ์ฌ์ง์ด PHP์ ๊ฐ์ ๋๋ถ๋ถ์ ์๋ฒ ์ธก ์น ํ๋ ์์ํฌ๊ฐ ๊ธฐ์ ์ ์ผ๋ก ๋จ๋ฐฉํฅ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. React๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์๋ ์ฃผ๋ฅ SPA ํ๋ ์์ํฌ์ ํด๋ผ์ด์ธํธ ์ธก UI ํ๋ ์์ํฌ์์ ์ผ๋ฐ์ ์ด์ง ์์์ต๋๋ค.
@JeroMiya ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ MVU๋ฅผ ์ดํดํ๋ ๋ฐฉ์์
๋๋ค.
MVU๋ฅผ ์ต์์ ํํ๋ก ์ฌ์ฉํ๊ณ ์์ํ๋ ๊ฐ์ฅ ์ค๋๋๊ณ ์ฌ์ ํ ์ฃผ๋ก ์ฌ์ฉํ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ค ํ๋๊ฐ MS Excel์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
@dsyme ๊ทํ์ ์๊ฒฌ์ ์ฝ๊ณ ์์ต๋๋ค. MAUI๋ฅผ ๋
ผ์๋ ์ํคํ
์ฒ(MVVM์ด ์๋ CSharpForMarkup)์ ์ฉ์ด๋ก ์ธ๊ธํ๊ณ ์๋ค๋ ๋๋์ด ๋ญ๋๋ค.
์ด๊ฒ์ด MAUI๊ฐ ์ดํดํ๋ ๋ฐ๊ฐ ์๋์ ๋ช
ํํ ํด์ฃผ์ธ์.
๋ด๊ฐ ์ดํดํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด MAUI๋ ๋ฏธ๋์ ์ด๋ ์์ ์์ XF๋ฅผ ๋์ฒดํ ๋ค์ MS ์์ฉ ํ๋ก๊ทธ๋จ ํ๋ ์์ํฌ์ผ ๋ฟ์
๋๋ค.
์ด ๋ฌธ์ ์ ๋๊ธ์ด ์งํ๋๋ ๋ฐฉ์์ด ์ ๋ง ๋ง์์ ๋ญ๋๋ค. ์ฐธ์ฌํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ MAUI์ ๋ํ ๊ฐ๋ฅํ ํ๋ฏธ๋ก ๋ชจ๋ ๋ค๋ฅธ ์ํคํ ์ฒ๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๊ณ ๋ช ๋ช ํ ์ ์์ต๋๋ค.
@dersia ๊ฐ์ฌํฉ๋๋ค! CSharpForMarkup์ ๋ํ ์ ๊ฒฝํ์ ๋ํ ์ฐธ๊ณ ์ฌํญ์
๋๋ค. MVVM๋ณด๋ค ์ฝ๊ฐ ๋ฎ์ ์์ค์
๋๋ค. C# ๋งํฌ์
์ ๋ณด๋ค ๊ฐ์ํ๋๊ณ ๋ณด๊ธฐ ์ข๊ฒ ๋ง๋ค๊ธฐ ์ํ ํ์ฅ ๋ฉ์๋ ๋ฐ ์ ํธ๋ฆฌํฐ ์งํฉ์ด ๋ ๋ง์ต๋๋ค. ViewModel ๋ฐ์ธ๋ฉ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋์ฐ๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ MVVM ํจํด์ ํ์คํ ๊ตฌํํ ์ ์์ง๋ง ๊ฒฐ๊ตญ ViewModel ๋์ Redux์์ ๋ชจ๋ ๋ทฐ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋๋ฉ๋๋ค. ๋ณด๊ธฐ ์์ฑ์ ์ํ ์ ํ๊ธฐ์ ๋ฐ์ธ๋ฉํ๋ ๋ช ๊ฐ์ง ํ์ฅ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. Func<StateType, ChildStateType>
Redux ์ํ ์ ์ฅ์์ Select
๋ฐ DistinctUntilChanged
์ฐ์ฐ์์ ์ ๋ฌํฉ๋๋ค. Observable<StateType>
. ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์๋์ง๋ง ์ง๊ธ Fabulous์ ๊ฐ์ UI ๊ฐ์ฒด ํธ๋ฆฌ ๋น๊ต ๋ฐ โโ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฑ์ํ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
์ผ๋ง ์ REST ๊ฒฝ์ฐฐ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ REST๋ผ๊ณ ๋ถ๋ฅด์ง ๋ง์์ผ ํ ๊ฒ์ ๋ชฉ๊ตฌ๋ฉ์ผ๋ก ๋ฐ์ด ๋ฃ์ผ๋ ค๊ณ ํ์ต๋๋ค. ์ค๋๋ ์๋ ๋ชจ๋๊ฐ ๊ทธ๊ฒ์ REST๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์ฐ๋ฆฌ ๋ชจ๋๋ ์ฌ์ ํ ์ด์ ์๊ณ ๊ฑด๊ฐํฉ๋๋ค. ๐
@bitbonk REST ์ปค๋ฎค๋ํฐ๋ ์ ์ ๋ ๋ง์ ๊ฒ๋ค์ด ํผํฉ๋๋ฉด์ ์ ์ ๋ ์ธ๋ชจ ์๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ์ด ์ฉ์ด๋ฅผ ํฌ๊ธฐํ์ต๋๋ค. ๊ทธ๋ค์ ์ด์ "ํ์ดํผ๋ฏธ๋์ด(hypermedia)"๋ฅผ ์ฌ์ฉํ์ฌ REpresentational State Transfer๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ค๋๋ REST๋ "SOAP ์๋" ๋๋ "JSON over HTTP"๋ง์ ์๋ฏธํ๋ฉฐ ๋ ๋ค ํต์ฌ ์์ด๋์ด๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฑ๊ณตํ์ง ๋ชปํฉ๋๋ค. ์ฌ๊ธฐ ๋๊ธ ์์ฑ์๋ MVU๊ฐ ๊ฐ์ ์ด๋ช ์ ๋ง์ดํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋ผ๊ณ ์์ต๋๋ค.
@davidortinau @tomasfabian , ์์ง MAUI์์ MVU์ ์๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋๋ ์ค๋ ๋ฐค์ ์์ ๋ฅผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ด๋ค. ์ฌ๊ธฐ ์์ WinForms์ ๋ํด ๋น์ทํ ์์ ์ ์ํ
@JeroMiya ๊ฐ์ฌํฉ๋๋ค. ํด๋น ์ฉ์ด์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ต๋๊น?
@dsyme , ๋๋ ๊ทธ๊ฒ์ด React Flux์์ ์์๋์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ค์ ๊ฒ์ ์ํคํ ์ฒ, ์ฆ Doom 3๋ฅผ ๊ฐ๋ฆฌ์ผฐ ์ต๋๋ค. ์ ์๊ฐ์๋ ์ด๊ฒ์ด ์ฒ์ ๋ฐํ๋์์ ๋
๋ค์์ C# ์์ ์ ๋ํ ์ ์ ์๋์ ๋๋ค. ์ค์ ์์ ๋ก ์ด๊ฒ์ ์๋ํ MAUI๊ฐ ์์ต๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์์์์? ์ด์จ๋ ์ด๊ฒ์ ์์ด๋์ด์ ๋๋ต์ ์ธ ๋ฒ์ญ์ ๋๋ค.
using Model = int;
interface IMsg {}
sealed class Increment : IMsg {}
Func<Model> init() => 0;
Func<IMsg, Model, Model> update = (IMsg msg, Model model) =>
{
return msg switch
{
Increment _ => model + 1,
_ => throw new NotImplementedException()
};
};
Func<Model, Action<IMsg>, View> view =
(Model model, Action<IMsg> dispatch) => new StackLayout
{
new Label("Welcome to .NET MAUI!"),
new Button(
() => $"You clicked {model} times.",
() => dispatch(new Increment())
)
};
// Program should be defined as part of MAUI and is used to start the flow.
// This should listen for messages, run the `update`, re-compute the `View`, then re-render.
var program = new Program<Model, IMsg>(init, update, view);
๋ณด๊ธฐ ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋น์ทํ ๊ฒ์ ํ ๋ฒ ๊ฐ๋จํ
์ ๋ MVU๋ฅผ ์ฒ์ ์ ํ๊ณ ์ฌ๋ฌ๋ถ ์ค ๋ง์ ๋ถ๋ค์ ๋นํด ์ฌ์ฉ ๊ฒฝํ์ด ๊ฑฐ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ MVU ๊ฐ๋ ์ ํ์คํ ๋ด ๊ด์ฌ์ ๋์๊ณ ๋๋ ๊ทธ๊ฒ์ ์ฆ๊ธฐ๊ณ ์์ต๋๋ค. C# ๊ฐ๋ฐ์๋ค์ด MVU ํจํด ๊ฐ๋ฐ์ ๋์์ด ๋๋ ํ๋ ์์ํฌ๋ฅผ ๋ฐ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
MAUI MVU๊ฐ ์ผ๋ฐ์ ์ธ MVU๊ฐ ์๋๋ฉฐ SwiftUI์ ์ํฅ์ด ํฌ๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ด ์ฑ ์ ์ฃผ์ ์ ์์ธ Clancey Himeslef๋ ๊ฑฐ์ ๋ชจ๋ ์ธ์ ์์ ์ด ์ ์ ๋งค์ฐ ๋ถ๋ช ํ๊ฒ ๋ฐํ์ต๋๋ค. Redux๊ฐ MVU์ ์ํฅ์ ๋ง์ด ๋ฐ์ผ๋ฉฐ SwiftUI, Flutter ๋ฐ ๊ธฐํ ๋ง์ ํ๋ ์์ํฌ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๊ทธ๋ค ์ค ๋๊ตฌ๋ ์์ํ MVU๊ฐ ์๋๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๋ชจ๋๋ ์ด๋ฌํ ๋ชจ๋ ํ๋ ์์ํฌ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํคํ ์ฒ ํจํด์ด MVU๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฐธ์กฐํ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๋ถํฐ 1๋ ๋ฐ ํ์ ์ถ์๋ ํ๋ ์์ํฌ์ ๋ธ๋ก๊ทธ ์ ๋ชฉ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ด ์ด ๋ธ๋ก๊ทธ ์ ๋ชฉ์ ๋ํด ํ๋ฅผ ๋ด๊ณ ์๋ค๊ณ ๋งํ๋ฉด. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ค์ ๋ํด ์ ๋ง๋ก ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ปค๋ฎค๋ํฐ๋ ์ฌ์ ํ ๊ณ์๋์ด์ผ ํฉ๋๋ค. ์ด ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๋์ง๋ฅผ ์ฌ์ฉํฉ์๋ค. ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๋ชจ๋๋ ์ด๋ฌํ ๋ชจ๋ ํ๋ ์์ํฌ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํคํ ์ฒ ํจํด์ด MVU๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฐธ์กฐํ๋ ์ด์ ์ ๋๋ค.
๊ฐ, ๋ง, ๊ณ ์์ด ๋ฐ ์นจํฌ์ง๋ ๋ชจ๋ ์๋ก ๋งค์ฐ ๊ฐ๊น์ต๋๋ค. ์ด์ ๋ถํฐ๋ ๋ชจ๋ ๊ณ ์์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
:) ๊ธ์, ๋น์ ์ ํ ํ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง ํ ๊ฐ์ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ณ ์์ด, ํธ๋์ด, ํ๋ฒ ๋ฑ์ ๊ณ ์์ด๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ๊ทธ๊ฒ์ ๊ฐ์ ธ ์์ ๊ธฐ์ฉ๋๋ค. ์ฌ๊ธฐ๊ฐ ๋ฐ๋ก ๊ทธ ๊ฒฝ์ฐ์ ๋๋ค.
@aspnetde : Thomas, ๋งํ ๋ชจ๋ ๊ฒ. ๊ทํ์ ์๋ MVU ๋ธ๋ก๊ทธ๋ ๊ฐ๋ ์ ๋งค์ฐ ๋ช ํํ๊ณ ์ ํํ๊ฒ ์ค๋ช ํ๋ ์ต๊ณ ์ ๊ธฐ์ฌ ์ค ํ๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ผ๋ก๋ถํฐ ์๋นํ ๊ฒ์ ๋ฐฐ์ ๋ค. ๊ฐ์ฌํฉ๋๋ค
@ libin85 ์ ํํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋น์ ์ ์ค์ ๋ก ํ ๋ฒ์ฃผ์ ์ํ๋ ๊ฒ๋ค์ ์ด๊ฑฐํ๊ธฐ ์์ํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒ๋ค์ ๋ฌด์ํ์ต๋๋ค. MAUI ์ํ์ MVU ๋ฒ์ฃผ์ ๋ฃ์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์นจํฌ์ง๋ฅผ ๊ณ ์์ด ๋ฒ์ฃผ์ ๋ฃ์ต๋๋ค.
๋ณ๊ฒฝํ ์ ์๋ ๋ณด๊ธฐ์ ๊ฐ์ MVU ๊ตฌํ๊ณผ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฉ์์ง ๋ฃจํ๊ฐ ์๊ณ ๋ช ์์ ์ธ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ๊ณผ ๊ฐ์ ๋ถ๋ช ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ๋ชจ๋ธ์ View์์ ์ง์ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฌ๋๋ค์ด MVU๋ฅผ ์๊ฐํด๋์ ๋ ๋ช ์์ ์ผ๋ก ์ํ์ง ์์๋ ๊ฒ์ ๋๋ค. ์ผ๋ถ ์ธ์ด์์๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ด MVU๊ฐ ๋ฑ์ฅํ ์ด์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋์คํ ๋ ์ด์ . ์ด์ MVU ์ ์์์ ํด๋น ์์ฑ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํฉ๋๋ค.
@forki : ๋๋ ๋น์ ์ด ๋งํ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ์ฌ์ค ์ฐ๋ฆฌ๊ฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ ๋ชฉ์ด ์๋๋ผ ์ปค๋ฎค๋ํฐ๋ก์ ๋ ผ์ํด์ผ ํ๋ ๊ฒ์ ๋ง์ง๋ง ๋๊ธ์์ ์ ๊ธฐํ ์์ ์ ๋๋ค. ๊ทธ๊ฒ ์ ์์ ์ ๋๋ค. ์ด๋ ๋ ผ์ํ ๊ธ์ ์ ์ธ ๊ฒ์ด๋ฉฐ ํ๋ ์์ํฌ๋ ์ด๋ฅผ ํตํด ์ป์ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋ ์ค์ํ ์ธก๋ฉด์์ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํด์๋ ์ ๋๋ ์ฝ๊ฐ์ ์ธ๋ถ ์ฌํญ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ทธ๊ฒ์ ๊บผ๋ธ ์ด์ ๋ ๊ฐ์ธ์ ์ผ๋ก MAUI๋ฅผ ์์์ด ๊ฒฐ๊ตญ ๊ณตํต์ ์ผ๋ก ํฉ์๋ ํด๊ฒฐ์ฑ ์ผ๋ก ์ด๋๋ ๊ณต๋์ฒด์ ๋ ธ๋ ฅ์ผ๋ก ๋ณด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋น๊ณต๊ฐ ๊ฒฐ์ ์ด ๋ด๋ ค์ง๋ Microsoft ์ ํ์ ๋๋ค. ๋๋ ๋ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ธฐ ์ํด ๊ณ ๊ฐ์ผ๋ก์ ์ฌ๊ธฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๋ชจ๋๋ ์ด๋ฌํ ๋ชจ๋ ํ๋ ์์ํฌ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํคํ ์ฒ ํจํด์ด MVU๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
@ libin85 ๋๋ ์ด๊ฒ์ด ๊ฐ์ฅ ๊ฐ๊น์ด ์ํคํ ์ฒ ํจํด์ด๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. MVU๋ ์ผ๋ฐ์ ์ผ๋ก MVP ๋๋ Model View Presenter์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋ํ ์ผ๋ จ์ ์ ์ฝ ์กฐ๊ฑด์ ๋๋ค. MVVM์ ํ๋ฆฌ์ ํฐ๊ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ์๋ ViewModel์ด๋ผ๋ ์ ์์ ๋ค๋ฅธ ๋ฐฉํฅ์ ์ทจํ๋ ์ ์ฌํฉ๋๋ค. MVP ์์ฒด๋ MVC์ ์ ํ๋ ํํ์ ๋๋ค. ์ด๊ฒ๋ค์ด ๋ชจ๋ MVC, ์ฌ์ง์ด MVP์ ํ์์ด๋ผ๊ณ ํด๋ ๊ณผ์ธ์ด ์๋ ๊ฒ ๊ฐ์ง๋ง, MVU๊ฐ SwiftUI, Flux ๋ฑ์ ์ ์ฉ๋๋ค๋ ๊ฒ์ MVU๋ฅผ ๋ฌด์๋ฏธํ ์ฉ์ด๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋ ์ค์ํ ์ธก๋ฉด์์ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํด์๋ ์ ๋๋ ์ฝ๊ฐ์ ์ธ๋ถ ์ฌํญ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
์๋์, ์ด๋ฆ์ด ์ค์ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ์๋ฏธ๋ฅผ ํ๋ฆฝํ๊ณ ์ ์งํ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค. ์์์ ๋ ผ์ํ REST๋ ์ฐธ์กฐํ์ญ์์ค. REST๋ ๋๋ฌด ๋จ์ฉ๋์ด ๋ง์ผํ ์ ๋ฌธ ์ฉ์ด ์ธ์๋ ๋ ์ด์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํนํ MAUI์ "MVU"๊ฐ ์ ๊ณตํ๋ ๋ด์ฉ์ ๋ํ ๊ธฐ์กด ์ฉ์ด๊ฐ ์๋ ๊ฒฝ์ฐ MVU์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ MAUI "MVU"๋ MVVM ์ต์ ์ ๋ํ ์ข์ ๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. REST์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํ๊ณ ์ข์ ๊ฒ์ ๋ง๋ค๊ธฐ ์ํด ์ ์์ ์ธ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ ์๋๊ณ ํ๋ฆฝ๋ ํจํด์์ ๋ถ๋ช ํ ๋ฒ์ด๋๋ ๋์์ผ๋ก ์ด๋ฆ์ ํผ๋ํ์ง ๋ง์ญ์์ค. ๊ฒฐ๊ตญ MVU๋ _๋ํ_ MVVM ๋ฐ Comet ์ต์ ์ ๋ํ ์ข์ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ MAUI "MVU"๋ MVVM ์ต์ ์ ๋ํ ์ข์ ๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. REST์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํ๊ณ ์ข์ ๊ฒ์ ๋ง๋ค๊ธฐ ์ํด ์ ์์ ์ธ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ๋ค๋ง ์ ์์์ ๋ถ๋ช ํ ๋ฒ์ด๋๋ ๋์์ผ๋ก ์ด๋ฆ์ ํผ๋ํ์ง ๋ง์ญ์์ค.
์ ์ฒด ํ์ธ.
์ ์ด๋ฆ์ MSMVU๋ก ์ง์ ํ ๊น์? ํ์ฑ์ MVU์์ผ๋ฉฐ ์์ผ๋ก๋ ๊ทธ๋ด ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฐ์ด๋ MVU์ ๋๋ค.
@saint4eva ๊ทธ๋ค์ "ํ๋งค"๋์ง๋ง ์ ์์ MVU๋ ์๋๋๋ค.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋ ์ค์ํ ์ธก๋ฉด์์ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํด์๋ ์ ๋๋ ์ฝ๊ฐ์ ์ธ๋ถ ์ฌํญ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
์๋์, ์ด๋ฆ์ด ์ค์ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ์๋ฏธ๋ฅผ ํ๋ฆฝํ๊ณ ์ ์งํ๋ ๊ฒ์ด ์ด๋ ต์ต๋๋ค. ์์์ ๋ ผ์ํ REST๋ ์ฐธ์กฐํ์ญ์์ค. REST๋ ๋๋ฌด ๋จ์ฉ๋์ด ๋ง์ผํ ์ ๋ฌธ ์ฉ์ด ์ธ์๋ ๋ ์ด์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํนํ MAUI์ "MVU"๊ฐ ์ ๊ณตํ๋ ๋ด์ฉ์ ๋ํ ๊ธฐ์กด ์ฉ์ด๊ฐ ์๋ ๊ฒฝ์ฐ MVU์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ MAUI "MVU"๋ MVVM ์ต์ ์ ๋ํ ์ข์ ๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. REST์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฉํ๊ณ ์ข์ ๊ฒ์ ๋ง๋ค๊ธฐ ์ํด ์ ์์ ์ธ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ ์๋๊ณ ํ๋ฆฝ๋ ํจํด์์ ๋ถ๋ช ํ ๋ฒ์ด๋๋ ๋์์ผ๋ก ์ด๋ฆ์ ํผ๋ํ์ง ๋ง์ญ์์ค. ๊ฒฐ๊ตญ MVU๋ _๋ํ_ MVVM ๋ฐ Comet ์ต์ ์ ๋ํ ์ข์ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ ๋๋ถ๋ถ์ ๋์ํ์ง๋ง "๋ง์ฐ์ด MVU"๋ ์ฌ์ ํ ๋์๊ณ ํผ๋ ์ค๋ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ "๋ง์ฐ์ด MVP" ๋๋ MVC๋ก ๊ฐ ๊ฒ์ ๋๋ค. ๋ ๋ค ์๋ํ๋ฉฐ MVU๋ณด๋ค ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ํ์๋ ๋ด์ฉ์ ๋ ๊ฐ๊น์ต๋๋ค.
์ถ๊ฐ ํธ์ง:
์ ์๋ ๋ฒ์ ์ด ์ด๋์ ์๋์ง์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด ๋ง์ MVVM์ ๋
ผ๋ฆฌ๋ ViewModel์ ์๊ณ MVU๋ ์
๋ฐ์ดํธ ๊ธฐ๋ฅ ๋ด์ ์๊ณ MVP๋ Presenter์ ์๊ณ MVC๋ Controller์ ์๋ค๋ ๋ป์
๋๋ค.
๋ชจ๋ ๊ฒ์ด ์ฌ๋ ๋ทฐ๊ฐ ์์๊น์? ์๋๋ฉด ๋ณด๊ธฐ, ๋ ผ๋ฆฌ ๋ฐ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ํด ๋ช ๋ช ๋ ์ผ๋ถ ํด๋์ค์ ๋ชจ๋ ์กด์ฌํฉ๋๊น? ๋ชจ๋ธ์ ๋ณ๋์ ํด๋์ค(์ ํ) ๋๋ ๋ ์ฝ๋์ฌ์ผ ํฉ๋๊น?
๋๋ ์ด๊ฒ์ด ๋๋ฅผ ์ํ ์ฃผ์ ๊ณ ์ถฉ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด "์ ์"๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ, ๋ชจ๋ธ ๋ฐ ๋ณด๊ธฐ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก MAUI๋ ์ง๊ธ๊น์ง ๋ ผ์๋ ํจํด๋ณด๋ค ์ฝ๊ฐ ๋ฎ์ ์์ค์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ ๋ก๋ ๋ค๋ฅธ ํจํด์ ๋ชจ๋ธ(๋๋ ์ํ) ๋ฐ ๋ณด๊ธฐ ๋ถ๋ถ์ ๋๋ค. ๋ค๋ฅธ ํจํด์ ๊ตฌํํ๊ธฐ ์ํด ๊ตฌ์ถํ ์ ์๋ ๊ฒ(์ํ ๊ด๋ฆฌ๊ฐ ๋ค์ ๋ ๋จ์ ์ด๊ธด ํ์ง๋ง).
์๋ฅผ ๋ค์ด State<T>
์ T
๊ฐ ViewModel๊ณผ ์ ์ฌํ ํด๋์ค์ด๊ณ ๋ณ๋์ ๋ฐ์ดํฐ ๋ชจ๋ธ ํด๋์ค ์ธํธ๋ฅผ ์ถ๊ฐํ๋ฉด MVVM๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค. ๋จ๋ฐฉํฅ๋ณด๊ธฐ.
๋ฐ๋ฉด์ Redux์ ์ ์ฌํ ์ํ ๊ด๋ฆฌ ์์คํ
์ ์ถ๊ฐํ๊ณ Redux ์ํ ๋ชจ๋ธ์ T
in State<T>
ํ๋ฉด ๊ฒฐ๊ตญ MVU์ ๋งค์ฐ ๊ฐ๊น์ด ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค. , Elm/Fabulous์ ๊ฐ์ ๊ธฐ์กด MVU๋งํผ ์์ ํ ํตํฉ๋์ง๋ ์์์ง๋ง. Fabulous๊ฐ Xamarin.Forms์์ ์ํํ๋ ๊ฒ์ฒ๋ผ MVU ํ๋ ์์ํฌ ๋ค์ MAUI ๋ณด๊ธฐ๋ฅผ ์จ๊ธธ ์ ์์ต๋๊น?
MAUI๋ฅผ ํตํด MVC ๋๋ MVP ํจํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ต์ ์ธ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ก ๋ณด๊ธฐ ๊ธฐ๋ฅ์ "์์ "์ ๋ ธ์ถํ๋ ๋ณ๋์ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค๋ฉด ์๋ง ์๊ฐํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด MAUI ํ์ธ ๋ํ ์์๊ฐ ์๊ณ "์ปจํธ๋กค๋ฌ" ํด๋์ค์ "ClickOK" ๋ฉ์๋์ "ClickCancel" ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. MAUI ๋ณด๊ธฐ๋ ๋ณด๊ธฐ์์ ์ ๋ชจ๋ธ์ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ ์ปจํธ๋กค๋ฌ๋ก ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํฉ๋๋ค.
@JeroMiya ๋์ํฉ๋๋ค. ํ์คํ Redux ํจํด์ ์ฌ์ฉํ๋ฉด MVU์ ๋ ๊ฐ๊น์์ง๊ณ ์ํคํ ์ฒ๋ฅผ ํจ์ฌ ๋ ๋นํ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค. ์ ๋ React-Redux, React-Hooks, ReactiveX ๋ฐ ์ต๊ทผ Blazor Apps :heart: Fluxor :heart: ์ ํ๋ณตํ ์ฌ์ฉ์์ ๋๋ค. @mrpmorris ๊ฐ ์ด ๋ํ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
๋ค์์ C# ์์ ์ ๋ํ ์ ์ ์๋์ ๋๋ค. ์ค์ ์์ ๋ก ์ด๊ฒ์ ์๋ํ MAUI๊ฐ ์์ต๋๋ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์์์์? ์ด์จ๋ ์ด๊ฒ์ ์์ด๋์ด์ ๋๋ต์ ์ธ ๋ฒ์ญ์ ๋๋ค.
using Model = int; interface IMsg {} sealed class Increment : IMsg {} Func<Model> init() => 0; Func<IMsg, Model, Model> update = (IMsg msg, Model model) => { return msg switch { Increment _ => model + 1, _ => throw new NotImplementedException() }; }; Func<Model, Action<IMsg>, View> view = (Model model, Action<IMsg> dispatch) => new StackLayout { new Label("Welcome to .NET MAUI!"), new Button( () => $"You clicked {model} times.", () => dispatch(new Increment()) ) }; // Program should be defined as part of MAUI and is used to start the flow. // This should listen for messages, run the `update`, re-compute the `View`, then re-render. var program = new Program<Model, IMsg>(init, update, view);
Microsoft ์ํ์์๋ณด๋ค ์ ๋ฐ์ดํธ์ ๋ ๋ง์ ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํฉ๋๊น? ์ด ๋ชจ๋ธ์์๋ MS ์ํ์์์ ๋ฌ๋ฆฌ ๋ชจ๋ UI ์์๋ฅผ ํฌํจํ๋ ์ ๋ณด๊ธฐ๊ฐ ์ธ์คํด์คํ๋๋ฉฐ ๊ธฐ์กด ๋ณด๊ธฐ ์์๋ ์ ์๋ฆฌ์ ๋๊ณ ๋ ์ด๋ธ ๊ฐ๋ง ์ ๋ฐ์ดํธ๋ฉ๋๋ค(์ฌ -์ฌ์ด์ง ๋น์ฉ์ด ์์ ์ ์์).
์ด ์ฐจ์ด์ ์ ์ด๋ฆ ์ง์ ์ ๋ํ ์ด ํ ๋ก ์ ์ด๋๋ ํต์ฌ ์ฐจ์ด์ ์ค ํ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ ํต์ ์ผ๋ก ์ ์๋ MVU ์ํคํ ์ฒ์ UI๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ๋ค๋ฅธ ๊ธฐ์ ์ด ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๊ธฐ์ ์ด ๋ค์ ์์ค์์ ๊ตฌํ๋๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ ๋๋ง ์์ง?
@markmccaigue ์ฑ๋ฅ ๊ด๋ จ: ์ข ์ข MVU ์์คํ ์๋ ๊ฐ์ ๋ณด๊ธฐ(๋๋ html์ ๊ฒฝ์ฐ ๊ฐ์ DOM)์ ๋ค์ํ ์์ง์ด ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ๋ฐ๋ผ์ DOM์ ๊ฐ์ DOM๊ณผ ๋น๊ตํ ํ ํ๋ ์์ํฌ๋ DOM์ ํจ์น๋ฅผ ์ ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๊ฒ์ ํนํ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์์ ํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ํจ์จ์ ์ ๋๋ค.
์๋ ํ์ธ์!!
๋๋ ์ง๊ธ์ด ๋ฌธ์ ๋ฅผ ๋ซ์ ๊ฒ์ ๋๋ค .. ๋๋ ์ด๊ฒ์ ํ ๋ก ํ๊ณ ์ถ์ง๋ง github๋ ๊ทธ๊ฒ์ ์๋์ํค๊ณ ์ถ์ง ์์ต๋๋ค :-/
์ด ๋ํ๋ฅผ ๊ณ์ํ๊ณ ์ถ์ ์ฌ๋์ด ์์ผ๋ฉด ํ ๋ก ํญ๋ชฉ์ ๋ง๋ ๋ค์ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ์์ ์ธ๊ธ๋์์ผ๋ฏ๋ก ๋ช ๊ฐ์ง๋ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
MAUI๋ ํ๋ฅญํ๊ณ ์ํคํ ์ฒ๋ก์์ MVU์ ๋ํด ๋ฐฐ์ฐ๋ ๊ฒ์ ์ฌ๋๋ค์ด MAUI๋ฅผ ์ดํดํ๋ ๋ฐ ์ ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋จ์ด์ ์ฝ๋งค์ด๊ธฐ ์ฝ๊ณ , ์ด ๋จ๊ณ์์ ์ฐ๋ฆฌ ๋ชจ๋ ์จ์ ์ฌ๊ณ ๊ฑฑ์ ํ์ง ์์ผ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ์ฌ์ฉ๋๋ ๋จ์ด๋ฅผ ์กฐ์ ํ ์๊ฐ์ด ์ถฉ๋ถํ๊ณ ์ ํํ ์ฉ์ด์ ๋ํ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์๋ค. ๊ฐ์ธ์ ์ผ๋ก Elm์ "MVU"์ ๊พธ๋ฐ์ด ์๊ณ ํ์ ๋์ง ์์ ์ฌ์ฉ์ด ๋ช ์์ ๋ฉ์์ง, ๋ช ์์ ์ ๋ฐ์ดํธ, ๊ธฐ๋ฅ์ ๋ชจ๋ธ, ๊ธฐ๋ฅ์ ๋ทฐ ์ฌ๊ณ์ฐ ๋ฐ ์ฐจ๋ฑ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฏธํ๋ค๋ ๊ฒ์ ํ๋ฆฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ MVU ์๋ ๋ง์
๋๋ ์ฌ๋๋ค์ด ์ด ๋ถ์ผ์ ๋ํด ๋งค์ฐ ๊ฐํ ์ ๋ ๊ณผ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝํฅ์ด ์๊ณ ๋งค์ฐ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ผ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด๋ค ๊ฒ์ธ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋์์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณต๊ฐ์ ๋ชจ๋ ์ง์ ์๋ ์ฅ๋จ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฅํ ์ต๊ณ ์ ๊ธฐ์ ์ ๋ง๋ค๊ธฐ ์ํด ๋ชจ๋ ์ฌ๋์ด ํจ๊ป ์๋ํ๊ณ , ์ฌ์ฉํ๊ณ , ๋ฐฐ์ฐ๊ณ , ๊ณต์ ํ๊ณ , ํ๋ ฅํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.