al6uiz
1์ 6, 2026, 10:15์ค์
1
๊ฐ๋จํ ์ ํธ๋ฆฌํฐ๋ ์ํ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ ๋ฐฐํฌํ๊ณ ์ถ์ ๋ .NET ๋ฐํ์ ์ค์น ์์ฒด๊ฐ ๋ถ๋ด์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
Native AOT๋ ํ๋์ ๋์์ด์ง๋ง ํ์ค์ ์ผ๋ก๋ ์ ํ์ง๊ฐ ์ ํ์ ์
๋๋ค.
WPF / WinForms ๋ Native AOT๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
Avalonia ๋ Native AOT์ ํธ๋ฆฌ๋ฐ์ ์ ์ฉํ๋๋ผ๋ Skia ๋ฐฑ์๋ ๋ฑ์ ์ํฅ์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ด ์์ญ MB์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๊ฐ๋จํ ๊ณ์ฐ๊ธฐ๋ ์ค์ ๋๊ตฌ ์์ค์ ํ๋ก๊ทธ๋จ์ ์ ์ฉํ๊ธฐ์๋ ๋ฐฐํฌ ํฌ๊ธฐ ๋๋น ํจ์ฉ์ด ๋ง์ง ์๋ ์ํฉ์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด์ํ๊ธฐ ์ํด MewUI ๋ผ๋ ๊ฒฝ๋ .NET UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ GPT์ ํจ๊ป ๋ง๋ค์ด๋ดค์ต๋๋ค.
A lightweight code-first .NET UI toolkit focused on fluent C# markup and NativeAOT-friendly
ํ๋ก์ ํธ ๋ชฉํ
MewUI์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Native AOT ๋ฐฐํฌ๋ฅผ ์ ์ ๋ก ํ ์ต์ ๊ตฌ์ฑ์ UI ํ๋ ์์ํฌ
๋ฐํ์ ์ค์น ์์ด ๋จ์ผ ์คํ ํ์ผ ๋ฐฐํฌ
โํ ์คํ UI ํ๋ ์์ํฌโ๊ฐ ์๋ ๊ฐ๋จํ ํด ์ ์์ ํ์ํ ์ต์ ๊ธฐ๋ฅ ์ ์ง์ค
์ด๊ธฐ ๋จ๊ณ์์๋ ๋ค์ ๋ฒ์๋ฅผ ์ฐ์ ์ง์ํ ์์ ์
๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ปจํธ๋กค ๋ฐฐ์น
๋จ์ํ ๋ ์ด์์ ๊ตฌ์ฑ
์ํ ์ ํธ๋ฆฌํฐ ๋ฐ ๋ด๋ถ ๋๊ตฌ์ ์ ํฉํ UI ํํ
๊ฐ๋จํ ๋ฐ์ธ๋ฉ๊ณผ ์ปจ๋ฒํฐ
๋ณต์กํ ์คํ์ผ๋ง, ๊ณ ๊ธ ์ ๋๋ฉ์ด์
, ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฑ์ ํ์ฌ ๋ฒ์์ ํฌํจํ์ง ์์ต๋๋ค.
๊ฐ๋ฐ ๋ฐฉ์
์ด ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
GPT Plus ํ๋ / GPT-5.2 (CODEX ์๋) / Medium ์ถ๋ก / 150K ํ ํฐ
์ค์ ์ฝ๋ ์ง์ ์์ ์์ด ํ๋กฌํํธ ์ดํฐ๋ ์ด์
๋ง์ผ๋ก ์ค๊ณ ๋ฐ ๊ตฌํ
์ค๊ณ ๋ณด์, API ๊ตฌ์กฐ ์กฐ์ , ๋ด๋ถ ๊ตฌ์ฑ ๊ฐ์ ์ ๋ชจ๋ ๋ํ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ ํ์ฌ ํํ๊น์ง ๊ตฌํํ์ต๋๋ค.
ํฅํ ๊ณํ
์๊ฐ์ด ํ๋ฝ๋๋ค๋ฉด ๋ค์ ๊ธฐ๋ฅ๋ ์ถ๊ฐ๋ฅผ ๊ฒํ ํ ์์ ์
๋๋ค.
๋์์ธ ํ๋ฆฌ๋ทฐ ๋๊ตฌ
๋ฐํ์ ํซ ๋ฆฌ๋ก๋
Native AOT ์นํ์ ์ธ ์ถ๊ฐ ์ปจํธ๋กค ํ์ฅ
์ด ์ญ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์งํํ ๊ณํ์
๋๋ค.
๋ง๋ฌด๋ฆฌ
MewUI๋ ์์ง ์ด๊ธฐ ๋จ๊ณ์ด๋ฉฐ ๋ฒ์ฉ UI ํ๋ ์์ํฌ๋ฅผ ๋ชฉํ๋ก ํ์ง๋ ์์ต๋๋ค.
๋ค๋ง โ์ด ์ ๋ ๊ท๋ชจ์ UI์ ์์ญ MB๊ฐ ํ์ํ๊ฐโ๋ผ๋ ๋ฌธ์ ์์์์ ์ถ๋ฐํ ํ๋์ ๋์์
๋๋ค.
๊ฐ๋จํ .NET ๋๊ตฌ ๋ฐฐํฌ, Native AOT ๊ธฐ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ, ์ด๊ฒฝ๋ UI์ ๊ด์ฌ ์๋ ๋ถ๋ค์ ์๊ฒฌ๊ณผ ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค.
16๊ฐ์ ์ข์์
al6uiz
1์ 6, 2026, 10:16์ค์
2
MewUI ๋ NativeAOT + Trim ์ฑ์ ๋ชฉํ๋ก ํ๋, ์ฝ๋ ๊ธฐ๋ฐ(code-first) ๊ฒฝ๋ ํฌ๋ก์ค ํ๋ซํผ .NET GUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์ํ: ์คํ์ ํ๋กํ ํ์
๋ฒ์ ์
๋๋ค(๊ธฐ๋ฅ/๋์/API๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค).
์ฐธ๊ณ : ์ด ์ ์ฅ์์ ๋๋ถ๋ถ์ ์ฝ๋๋ GPT์ ๋์์ผ๋ก ์์ฑ๋์์ต๋๋ค.
์คํฌ๋ฆฐ์ท
ํ์ด๋ผ์ดํธ
NativeAOT + Trim ์ฐ์
๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ (๊ฐ๋ฒผ์ด ์คํ ํ์ผ ํฌ๊ธฐ, ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ํํ๋ฆฐํธ, ๋น ๋ฅธ ์์)
Fluent C# ๋งํฌ์
๊ฒฝ๋(Lightweight)
์คํ ํ์ผ ํฌ๊ธฐ: NativeAOT + Trim ์ค์ฌ(์ํ win-x64-trimmed ์ฝ 2.2 MB)
์ํ ๋ฐํ์ ๋ฒค์น๋งํฌ (NativeAOT + Trimmed, 50ํ ์คํ):
๋ฐฑ์๋
Loaded avg/p95 (ms)
FirstFrame avg/p95 (ms)
WS avg/p95 (MB)
PS avg/p95 (MB)
Direct2D
10 / 11
178 / 190
40.0 / 40.1
54.8 / 55.8
GDI
15 / 21
54 / 67
15.2 / 15.3
4.6 / 4.8
C# ๋งํฌ์
var window = new Window()
.Title("Hello MewUI")
.Size(520, 360)
.Padding(12)
.Content(
new StackPanel()
.Spacing(8)
.Children(
new Label()
.Text("Hello, Aprillz.MewUI")
.FontSize(18)
.Bold(),
new Button()
.Content("Quit")
.OnClick(() => Application.Quit())
)
);
Application.Run(window);
์ปจ์
MewUI๋ ์๋ 3๊ฐ์ง๋ฅผ ์ต์ฐ์ ์ผ๋ก ๋ code-first UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค:
NativeAOT + Trim ์นํ
๋น ๋ฅด๊ณ ๊ฐ๋ณ๊ฒ (๋จ์ผ EXE ~2.2 MB, ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ํํ๋ฆฐํธ, ๋น ๋ฅธ ์ฒซ ๋ ๋ โ ์๋ ๋ฒค์น๋งํฌ ์ฐธ๊ณ )
XAML ์์ด Fluentํ C# ๋งํฌ์
์ผ๋ก UI ํธ๋ฆฌ ๊ตฌ์ฑ
์งํฅํ์ง ์๋ ๊ฒ:
WPF์ฒ๋ผ ์ ๋๋ฉ์ด์
, ํ๋ คํ ์ดํํธ , ๋ฌด๊ฑฐ์ด ์ปดํฌ์ง์
ํ์ดํ๋ผ์ธ
โ๋ค ๋ค์ด์๋โ ๋ฆฌ์น ์ปจํธ๋กค ์นดํ๋ก๊ทธ
XAML/WPF ์์ ํธํ์ด๋ ๋์์ด๋ ์ค์ฌ ์ํฌํ๋ก์ฐ
๋ ๋๋ง ๋ฐฑ์๋
๋ ๋๋ง์ ์๋ ์ถ์ํ๋ก ๋ถ๋ฆฌ๋ฉ๋๋ค:
IGraphicsFactory / IGraphicsContext
์ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก Direct2D๋ฅผ ์ฌ์ฉํ๋ฉฐ, GDI์ OpenGL๋ ์ ๊ณต๋ฉ๋๋ค.
ํ๋ซํผ ์ถ์ํ
์๋์ฐ/๋ฉ์์ง ๋ฃจํ๋ ํ๋ซํผ ๊ณ์ธต์ผ๋ก ์ถ์ํ๋์ด ์์ผ๋ฉฐ, ํ์ฌ๋ Windows ๊ตฌํ(Win32PlatformHost)์ ์ Linux/X11 ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ถํ macOS๋ ์ ๊ณต์์ .
NativeAOT / Trim
๊ธฐ๋ณธ์ ์ผ๋ก trimming-safe๋ฅผ ์งํฅํฉ๋๋ค.(๋ฆฌํ๋ ์
๊ธฐ๋ฐ ๋ฐ์ธ๋ฉ ์ง์)
Windows interop์ NativeAOT ํธํ์ ์ํด ์์ค ์์ฑ P/Invoke(LibraryImport)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ํ/๋ฐ์ธ๋ฉ(AOT ์นํ)
๋ฐ์ธ๋ฉ์ ๋ฆฌํ๋ ์
์์ด, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ธฐ๋ฐ์
๋๋ค:
var percent = new ObservableValue<double>(0.25);
var slider = new Slider()
.BindValue(percent);
var label = new Label()
.BindText(
percent,
convert: v => $"Percent ({v:P0})");
์ปจํธ๋กค / ํจ๋
์ปจํธ๋กค:
Label, Button, TextBox
CheckBox, RadioButton
ListBox, ComboBox
Slider, ProgressBar
Window
ํจ๋:
Grid (row/column: Auto, *, pixel)
StackPanel (๊ฐ๋ก/์ธ๋ก + Spacing)
DockPanel (๋ํน + ๋ง์ง๋ง ์์ ์ฑ์ฐ๊ธฐ)
UniformGrid (๊ท ๋ฑ ์
)
WrapPanel (์ค๋ฐ๊ฟ + Item size + Spacing)
ํ
๋ง(Theme)
๋ผ์ดํธ ํ
๋ง์ ๋คํฌ ํ
๋ง ๋ ๊ฐ์ง๋ฅผ ์ง์ํ๋ฉฐ Accent ์์์ ์ง์ ํ ์ ์์ต๋๋ค.
Accent ๋ณ๊ฒฝ:
Theme.Current = Theme.Current.WithAccent(Color.FromRgb(214, 176, 82));
์์ ์ด์ธ์ ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ์ ์ง์ํฉ๋๋ค. (ํ
๋๋ฆฌ ๋ผ์ด๋ฉ, ๊ธฐ๋ณธ ํฐํธ ๋ฑ )
๋ก๋๋งต (TODO)
์ปจํธ๋กค
Image, GroupBox, TabControl, ScrollViewer
๋ ๋๋ง
ํ๋ซํผ
ํด๋ง
Hot Reload (๋์์ธ ํ์ ์ค์ฌ)
5๊ฐ์ ์ข์์
์!! ์ ๋ง ๊ธฐ๋๋๋๊ตฐ์.
์ด๊ฑธ ๋ณด๋ LLM์ผ๋ก ๋ง์๊ฐ ์ ๊ธฐํ **ATL(Active Template Library)**๋ฅผ ํ๋ํ ํด๋ณด๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
4๊ฐ์ ์ข์์
rkttu
1์ 6, 2026, 11:18์ค์
5
์ค.. ATL์ ์์๋๊ตฐ์! ์๊ณ ์์๋๋ฐ ์ค๋ซ๋ง์ ์๊ฐ๋ฌ์ต๋๋ค. (WTL์ด๋๊ฒ๋ ์์์ฃ . ใ
ใ
ใ
)
4๊ฐ์ ์ข์์
ํ.. ์ ์ปจํธ๋กค ์ฌ์ฉ ํ๋ฉด EXE ํ๋๋ง ๋ฐฐํฌ ๊ฐ๋ฅ ํ๊ฑด๊ฐ์ ??? ๊ทธ๋ผ๋ชจ ๋๋ฐ ์ธ๋
2๊ฐ์ ์ข์์
al6uiz
1์ 7, 2026, 3:55์ค์
7
MewUI๋ฅผ ์ฐธ์กฐํ๋ ํ๋ก์ ํธ๊ฐ ๋ฆฌํ๋ ์
์ฌ์ฉ ๋ฑ NativeAOT ์ปดํ์ผ ์ ์ฝ์ ์๋ฐํ๋ ๋ก์ง์ด๋ ์ถ๊ฐ ํจํค์ง ์ฐธ์กฐ ์์ด ๊ตฌ์ฑ๋ ์ ์๋ค๋ฉด, EXE ๋จ์ผ ํ์ผ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๋ํ FBA๋ก ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋คใ
https://github.com/aprillz/MewUI - FBA ์ํ์ฑ
https://github.com/aprillz/MewUI - FBA ๊ณ์ฐ๊ธฐ
์๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฉด ์ฆ์ ์คํํด ๋ณผ ์ ์์ต๋๋ค. (.NET 10 SDK ํ์)
Windows ์ปค๋งจ๋๋ผ์ธ
์ํ์ฑ
curl -sL https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_sample.cs -o - | dotnet run -
๊ณ์ฐ๊ธฐ
curl -sL https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_calculator.cs -o - | dotnet run -
Powershell
์ํ์ฑ
irm https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_sample.cs | dotnet run -
๊ณ์ฐ๊ธฐ
irm https://raw.githubusercontent.com/aprillz/MewUI/refs/heads/main/samples/FBASample/fba_calculator.cs | dotnet run -
NativeAOT Trim ๋น๋์ ์ฝ 1.8๋ฉ๊ฐ
5๊ฐ์ ์ข์์
al6uiz
1์ 7, 2026, 3:45์คํ
9
์ด์ Linux (X11)์์๋ ์ ๋์ํ๋ ํฌ๋ก์คํ๋ซํผ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋์์ต๋๋ค!
8๊ฐ์ ์ข์์