๐Ÿš€ Blazor WebAssembly๋กœ SPA ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Blazor WebAssembly๋กœ SPA ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํ•ซํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ Blazor WebAssembly๋ฅผ ์‚ฌ์šฉํ•ด์„œ SPA(Single Page Application)๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด๊ฑฐ ์ง„์งœ ๋Œ€๋ฐ•์ด์—์š”! ๐Ÿ˜Ž

์š”์ฆ˜ ์›น ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ๋ฅผ ๋ณด๋ฉด SPA๊ฐ€ ๋Œ€์„ธ์ž–์•„์š”? ๊ทธ๋Ÿฐ๋ฐ C# ๊ฐœ๋ฐœ์ž๋“ค์€ ์ข€ ์•„์‰ฌ์› ์ฃ . JavaScript ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๋งŒ ์ฃผ๋ชฉ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™๊ณ ... ๊ทผ๋ฐ ์ด์ œ ๊ทธ๋Ÿด ํ•„์š” ์—†์–ด์š”! Blazor WebAssembly๊ฐ€ ๋“ฑ์žฅํ–ˆ๊ฑฐ๋“ ์š”! ์ด์ œ C# ๊ฐœ๋ฐœ์ž๋“ค๋„ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์˜ ๊ฟˆ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”. ์–ด๋– ์„ธ์š”? ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”? Blazor WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด C#์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์ค€ ์„ ๋ฌผ์ด์ฃ !

์ž, ์ด์ œ๋ถ€ํ„ฐ Blazor WebAssembly์˜ ์„ธ๊ณ„๋กœ ๋น ์ ธ๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๊ณ ๊ณ ์”ฝ~! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐ŸŒŸ Blazor WebAssembly๋ž€ ๋ญ์•ผ? ๐ŸŒŸ

์ž, ๋จผ์ € Blazor WebAssembly๊ฐ€ ๋ญ”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ์ด๋ฆ„๋ถ€ํ„ฐ ์ข€ ๋ฉ‹์žˆ์ž–์•„์š”? ใ…‹ใ…‹ใ…‹

Blazor WebAssembly๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ๊ฐœ๋ฐœํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. ์ด ๋…€์„์˜ ํŠน๋ณ„ํ•œ ์ ์€ ๋ญ๋ƒ๊ณ ์š”? ๋ฐ”๋กœ C#์„ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜ฎ

๊ทธ๋Ÿผ ์ด๊ฒŒ ์™œ ๋Œ€๋‹จํ•œ ๊ฑด์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

  • ๐ŸŽ‰ C#์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์š”: JavaScript? ์•ˆ๋…•~ ์ด์ œ C#์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”. C# ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋Š” ์ •๋ง ๊ฟˆ๋งŒ ๊ฐ™์€ ์ผ์ด์ฃ !
  • ๐Ÿš€ WebAssembly ๊ธฐ๋ฐ˜์ด์—์š”: WebAssembly๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊นŒ์šด ์„ฑ๋Šฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด์—์š”. ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด์ฃ !
  • ๐Ÿ”— .NET ์ƒํƒœ๊ณ„์™€์˜ ์—ฐ๊ฒฐ: .NET์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋„๊ตฌ ๋“ฑ ๋ชจ๋“  ๊ฒƒ์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒƒ์ด์—์š”!
  • ๐ŸŒ ํฌ๋กœ์Šค ํ”Œ๋žซํผ: ๋ชจ๋“  ์ตœ์‹  ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•ด์š”. IE๋Š” ์•ˆ๋…•~ ๐Ÿ‘‹

์–ด๋•Œ์š”? ๋ฒŒ์จ๋ถ€ํ„ฐ ํฅ๋ถ„๋˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์ €๋„ ์ฒ˜์Œ Blazor WebAssembly๋ฅผ ์•Œ์•˜์„ ๋•Œ ์ •๋ง ๋†€๋ž์–ด์š”. C#์œผ๋กœ ์›น ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๋‹ˆ, ์ด๊ฒŒ ๋ง์ด ๋ผ์š”? ๊ทผ๋ฐ ์ง„์งœ์˜ˆ์š”! ๐Ÿ˜†

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Blazor๋ผ๋Š” ์ด๋ฆ„์€ 'Browser'์™€ 'Razor'๋ฅผ ํ•ฉ์นœ ๊ฑฐ์˜ˆ์š”. Razor๋Š” ASP.NET์˜ ๋ทฐ ์—”์ง„์ด์ฃ . ์ด๋ฆ„๋ถ€ํ„ฐ ์„ผ์Šค ์žˆ๋„ค์š”, ๊ทธ์ตธ?

์ž, ์ด์ œ Blazor WebAssembly๊ฐ€ ๋ญ”์ง€ ๋Œ€์ถฉ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๊ทผ๋ฐ ๊ทธ์ „์— ์ž ๊น! Blazor WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฌผ๋“ค์ด ์žˆ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ ์•Œ์•„๋ณด๋„๋ก ํ•ด์š”!

Blazor WebAssembly ๊ตฌ์„ฑ์š”์†Œ Blazor WebAssembly C# .NET WebAssembly Browser

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Blazor WebAssembly์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋“ค์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. C#, .NET, WebAssembly, ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งŒ๋‚˜ ๋ฉ‹์ง„ ํ•˜๋ชจ๋‹ˆ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ Blazor WebAssembly์˜ ๋งค๋ ฅ์ด์—์š”! ๐Ÿ˜

๐Ÿ› ๏ธ Blazor WebAssembly ๊ฐœ๋ฐœ ์ค€๋น„ํ•˜๊ธฐ ๐Ÿ› ๏ธ

์ž, ์ด์ œ Blazor WebAssembly๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ํ•ด๋ณผ๊นŒ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์–ด๋ ต์ง€ ์•Š์•„์š”! ใ…‹ใ…‹ใ…‹

1. .NET SDK ์„ค์น˜ํ•˜๊ธฐ

๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ .NET SDK๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. Blazor WebAssembly๋Š” .NET 5.0 ์ด์ƒ์„ ์ง€์›ํ•ด์š”. ์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ์ข‹๊ฒ ์ฃ ?

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”. ์„ค์น˜๋Š” ์ •๋ง ์‰ฌ์›Œ์š”. ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ  '๋‹ค์Œ'๋งŒ ๊ณ„์† ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋ผ์š”. ๋ญ”๊ฐ€ ์–ด๋ ค์šด ๊ฒŒ ๋‚˜์˜ค๋ฉด ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์‹œ๊ณ  ๊ทธ๋ƒฅ '์˜ˆ'๋ฅผ ๋ˆ„๋ฅด์„ธ์š”. ใ…‹ใ…‹ใ…‹

๐Ÿ’ก ํŒ: ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ PowerShell์„ ์—ด๊ณ  dotnet --version์„ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”. ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๋ฉด ์„ค์น˜๊ฐ€ ์ž˜ ๋œ ๊ฑฐ์˜ˆ์š”!

2. Visual Studio Code ์„ค์น˜ํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ ํ•„์š”ํ•œ ๊ฑด ์ฝ”๋“œ ์—๋””ํ„ฐ์˜ˆ์š”. Visual Studio Code๋ฅผ ์ถ”์ฒœํ• ๊ฒŒ์š”. ๋ฌด๋ฃŒ์ด๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ฑฐ๋“ ์š”. ๊ฒŒ๋‹ค๊ฐ€ Blazor ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๋„ ์žˆ์–ด์š”!

Visual Studio Code ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒƒ๋„ ์„ค์น˜๋Š” ์ •๋ง ๊ฐ„๋‹จํ•ด์š”. ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ณ ... ๋„ค, ๋งž์•„์š”. '๋‹ค์Œ'๋งŒ ๊ณ„์† ๋ˆ„๋ฅด๋ฉด ๋ผ์š”. ใ…‹ใ…‹ใ…‹

3. C# ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ํ•˜๊ธฐ

Visual Studio Code์—์„œ C# ๊ฐœ๋ฐœ์„ ๋” ํŽธํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด C# ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•ด์•ผ ํ•ด์š”. ์ด๊ฑด ์ •๋ง ์‰ฌ์›Œ์š”!

  1. Visual Studio Code๋ฅผ ์‹คํ–‰ํ•ด์š”.
  2. ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์•„์ด์ฝ˜(๋„ค๋ชจ ๋„ค ๊ฐœ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๋ชจ์–‘)์„ ํด๋ฆญํ•ด์š”.
  3. ๊ฒ€์ƒ‰์ฐฝ์— 'C#'์„ ์ž…๋ ฅํ•ด์š”.
  4. ๋งจ ์œ„์— ๋‚˜์˜ค๋Š” 'C#' ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์•„ 'Install' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์š”.

์งœ์ž”~ ์ด์ œ C# ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ์„ค์น˜๋˜์—ˆ์–ด์š”! ๐Ÿ‘

4. Blazor WebAssembly ํ…œํ”Œ๋ฆฟ ์„ค์น˜ํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ Blazor WebAssembly ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์„ค์น˜ํ•ด์•ผ ํ•ด์š”. ์ด๊ฑด ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ PowerShell์—์„œ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋กœ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::5.0.0

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Blazor WebAssembly ํ…œํ”Œ๋ฆฟ์ด ์„ค์น˜๋ผ์š”. ์ด์ œ ์ƒˆ๋กœ์šด Blazor WebAssembly ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”!

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Blazor WebAssembly๋Š” ์ฒ˜์Œ์—๋Š” ์‹คํ—˜์ ์ธ ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ–ˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋œจ๊ฑฐ์šด ๊ด€์‹ฌ ๋•๋ถ„์— ์ •์‹ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋ฐœ์ „ํ–ˆ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ ๊ฐœ๋ฐœ์ž ํŒŒ์›Œ! ๐Ÿ’ช

์ž, ์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์–ด์š”! ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ ์ง„์งœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ Blazor WebAssembly ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

Blazor WebAssembly ๊ฐœ๋ฐœ ์ค€๋น„ ๊ณผ์ • .NET SDK VS Code C# ํ™•์žฅ Blazor ํ…œํ”Œ๋ฆฟ

์œ„ ๊ทธ๋ฆผ์€ Blazor WebAssembly ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ค€๋น„ ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด์š”. ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ๋”ฐ๋ผ๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ๊ฐœ๋ฐœ ์ค€๋น„ ์™„๋ฃŒ! ๐Ÿ‘

๐Ÿš€ ์ฒซ Blazor WebAssembly ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ ๐Ÿš€

๋“œ๋””์–ด ์ฒซ Blazor WebAssembly ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์‹œ๊ฐ„์ด์—์š”! ์ •๋ง ์„ค๋ ˆ์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?

1. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

๋จผ์ € ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋‚˜ PowerShell์„ ์—ด๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณผ๊นŒ์š”?

dotnet new blazorwasm -o MyFirstBlazorApp

์ด ๋ช…๋ น์–ด๋Š” 'MyFirstBlazorApp'์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ๋กœ์šด Blazor WebAssembly ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์š”. '-o' ์˜ต์…˜์€ output์˜ ์•ฝ์ž๋กœ, ํ”„๋กœ์ ํŠธ ํด๋”์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”. ๋ญ”๊ฐ€ ์—ด์‹ฌํžˆ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๊ฒŒ ๋ณด์ผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ปคํ”ผ ํ•œ ์ž” ์–ด๋•Œ์š”? โ˜•

๐Ÿ’ก ํŒ: ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ ๋งˆ์Œ๋Œ€๋กœ ์ง€์–ด๋„ ๋ผ์š”. 'MyAwesomeBlazorApp'์ด๋ผ๊ณ  ํ•ด๋„ ๋˜๊ณ , 'ILoveBlazor'๋ผ๊ณ  ํ•ด๋„ ๋ผ์š”. ๊ทผ๋ฐ ๋„ˆ๋ฌด ๊ธธ๋ฉด ๋‚˜์ค‘์— ํƒ€์ดํ•‘ํ•˜๊ธฐ ํž˜๋“ค์–ด์š”. ใ…‹ใ…‹ใ…‹

2. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด, Visual Studio Code๋ฅผ ์—ด๊ณ  ๋ฐฉ๊ธˆ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์—ด์–ด๋ณผ๊นŒ์š”? 'File' > 'Open Folder'๋ฅผ ์„ ํƒํ•˜๊ณ  'MyFirstBlazorApp' ํด๋”๋ฅผ ์„ ํƒํ•˜์„ธ์š”.

์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์— ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ๋ณด์ผ ๊ฑฐ์˜ˆ์š”. ์–ด๋–ค๊ฐ€์š”? ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด๋‚˜์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ ํ…Œ๋‹ˆ๊นŒ์š”!

  • ๐Ÿ“ Pages: ์—ฌ๊ธฐ์— Razor ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žˆ์–ด์š”. ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋‹ด๋‹นํ•˜์ฃ .
  • ๐Ÿ“ Shared: ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๊ณต์œ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด ๊ฐ™์€ ๊ฑฐ์ฃ .
  • ๐Ÿ“„ Program.cs: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ด์—์š”. ์—ฌ๊ธฐ์„œ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ  ํ•„์š”ํ•œ ์„œ๋น„์Šค๋“ค์„ ๊ตฌ์„ฑํ•ด์š”.
  • ๐Ÿ“„ _Imports.razor: ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘๋Š” ํŒŒ์ผ์ด์—์š”.
  • ๐Ÿ“„ wwwroot/index.html: ๋ฉ”์ธ HTML ํŒŒ์ผ์ด์—์š”. Blazor ์•ฑ์ด ์—ฌ๊ธฐ์— ๋กœ๋“œ๋ผ์š”.

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

3. ํ”„๋กœ์ ํŠธ ์‹คํ–‰ํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”! ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  (Visual Studio Code์—์„œ๋Š” Ctrl+` ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ผ์š”) ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”.

dotnet run

์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ฝ˜์†”์— ๋ญ”๊ฐ€ ์ฃผ๋ฃจ๋ฃฉ ๋‚˜์˜ค๊ณ , ๋งˆ์ง€๋ง‰์— URL์ด ๋ณด์ผ ๊ฑฐ์˜ˆ์š”. ๋ณดํ†ต https://localhost:5001 ์ด๋Ÿฐ ์‹์ด์—์š”. ์ด URL์„ ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•ด๋ณด์„ธ์š”!

์งœ์ž”~ ๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ Blazor WebAssembly ์•ฑ์ด ์‹คํ–‰๋˜์—ˆ์–ด์š”!

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Blazor WebAssembly ์•ฑ์ด ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ๋Š” ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์–ด์š”. ์™œ๋ƒํ•˜๋ฉด .NET ๋Ÿฐํƒ€์ž„๊ณผ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๊ฑฐ๋“ ์š”. ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ๋กœ๋“œ๋˜๋ฉด ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์—„์ฒญ ๋นจ๋ผ์ ธ์š”! ๋งˆ์น˜ ์ฒ˜์Œ์—๋Š” ๋Š๋ฆฌ์ง€๋งŒ ๋‚˜์ค‘์— ์—„์ฒญ ๋นจ๋ผ์ง€๋Š” ๊ฑฐ๋ถ์ด ๊ฐ™์•„์š”. ใ…‹ใ…‹ใ…‹

4. ๊ธฐ๋ณธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

๋ธŒ๋ผ์šฐ์ €์— ๋‚˜ํƒ€๋‚œ ํŽ˜์ด์ง€๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ ๊ฐœ์˜ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์–ด์š”.

  • ๐Ÿ  Home: ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ˆ์š”. "Hello, world!"๋ผ๊ณ  ๋ฐ˜๊ฒจ์ฃผ๊ณ  ์žˆ์ฃ ?
  • ๐Ÿ“Š Counter: ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ์˜ˆ์š”.
  • ๐ŸŒค๏ธ Weather: ๊ฐ€์งœ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€์˜ˆ์š”.

์ด ํŽ˜์ด์ง€๋“ค์€ ๊ฐ๊ฐ Pages ํด๋” ์•ˆ์— ์žˆ๋Š” Index.razor, Counter.razor, FetchData.razor ํŒŒ์ผ์— ํ•ด๋‹นํ•ด์š”.

์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ๋‹จ์ˆœํ•˜์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ Blazor WebAssembly์˜ ๋งค๋ ฅ์ด์—์š”. ๋ณต์žกํ•œ JavaScript ์ฝ”๋“œ ์—†์ด๋„ ์ด๋Ÿฐ ๋™์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋‹ˆ! ๐Ÿ‘

Blazor WebAssembly ๊ธฐ๋ณธ ๊ตฌ์กฐ Home Counter Weather

์œ„ ๊ทธ๋ฆผ์€ Blazor WebAssembly ์•ฑ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด์š”. ์„ธ ๊ฐœ์˜ ์ฃผ์š” ํŽ˜์ด์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ ?

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ Blazor WebAssembly ์•ฑ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์–ด์š”! ์–ด๋–ค๊ฐ€์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ ์ด ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ๋งŒ์˜ ๋ฉ‹์ง„ SPA๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ์•ฑ์„ ์กฐ๊ธˆ์”ฉ ์ˆ˜์ •ํ•ด๋ณด๋ฉด์„œ Blazor WebAssembly์˜ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ํ˜น์‹œ ์—ฌ๋Ÿฌ๋ถ„์ด ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์žฌ๋Šฅ๋„ท์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์ธ๋ฐ์š”, ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด Blazor WebAssembly ๊ฐœ๋ฐœ ์‹ค๋ ฅ์„ ์Œ“์•„์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ํ™œ๋™ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๊ฐœ๋ฐœ์ž๋“ค๋ผ๋ฆฌ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ  ์„œ๋กœ ๋„์›€์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฑด ์ •๋ง ๋ฉ‹์ง„ ์ผ์ด์ž–์•„์š”? ๐Ÿ˜Š

๐Ÿ› ๏ธ Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ ๐Ÿ› ๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋งŒ์˜ Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ใ…‹ใ…‹ใ…‹

1. ์ปดํฌ๋„ŒํŠธ๋ž€?

์ปดํฌ๋„ŒํŠธ๋Š” UI์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํŠผ, ํผ, ๋Œ€ํ™” ์ƒ์ž ๋“ฑ์ด ๋ชจ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”. Blazor์—์„œ๋Š” ์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ C#๊ณผ HTML์„ ์„ž์–ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ?

๐Ÿ’ก ํŒ: ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ ˆ๊ณ  ๋ธ”๋ก์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ๊ฐ๊ฐ์˜ ๋ธ”๋ก์€ ๋…๋ฆฝ์ ์ด์ง€๋งŒ, ์ด๋“ค์„ ์กฐํ•ฉํ•ด์„œ ๋ฉ‹์ง„ ์ž‘ํ’ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ . ์ปดํฌ๋„ŒํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”!

2. ์ฒซ ๋ฒˆ์งธ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? 'Greeting'์ด๋ผ๋Š” ๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”.

  1. Visual Studio Code์—์„œ 'Pages' ํด๋”์— ์šฐํด๋ฆญํ•˜๊ณ  'New File'์„ ์„ ํƒํ•˜์„ธ์š”.
  2. ํŒŒ์ผ ์ด๋ฆ„์„ 'Greeting.razor'๋กœ ์ง€์ •ํ•˜์„ธ์š”.
  3. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”:
@page "/greeting"

<h3>Hello, Blazor!</h3>

<p>Welcome to your new app.</p>

@code {
    // ์—ฌ๊ธฐ์— C# ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.
}

์งœ์ž”~ ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์–ด์š”! ๐Ÿ˜Ž

3. ์ปดํฌ๋„ŒํŠธ ์ดํ•ดํ•˜๊ธฐ

๋ฐฉ๊ธˆ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์„ธ ํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • @page "/greeting": ์ด ์ค„์€ ๋ผ์šฐํŒ…์„ ์ •์˜ํ•ด์š”. ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ '/greeting' URL์—์„œ ๋ณด์—ฌ์งˆ ๊ฑฐ๋ผ๋Š” ๋œป์ด์—์š”.
  • Hello, Blazor!

    : ์ด๊ฑด ๊ทธ๋ƒฅ HTML์ด์—์š”. Blazor์—์„œ๋Š” HTML์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • @code { ... }: ์—ฌ๊ธฐ์— C# ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜์ฃ .

4. ์ปดํฌ๋„ŒํŠธ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐ๊ธˆ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? ์ด๋ฆ„์„ ๋ฐ›์•„์„œ ์ธ์‚ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”.

'Greeting.razor' ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”:

@page "/greeting"
@page "/greeting/{Name}"

<h3>Hello, @Name!</h3>

<p>Welcome to your new app.</p>

@code {
    [Parameter]
    public string Name { get; set; } = "Blazor";
}

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•ด์กŒ์–ด์š”. ์–ด๋–ค ์ ์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณผ๊นŒ์š”?

  • ๋‘ ๊ฐœ์˜ @page ์ง€์‹œ๋ฌธ์ด ์žˆ์–ด์š”. ์ด์ œ '/greeting'๊ณผ '/greeting/SomeName' ๋‘˜ ๋‹ค ์ด ์ปดํฌ๋„ŒํŠธ๋กœ ์—ฐ๊ฒฐ๋ผ์š”.
  • [Parameter] ์†์„ฑ์ด ๋ถ™์€ Name ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด URL์—์„œ ์ด๋ฆ„์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.
  • Hello, @Name!์—์„œ @Name์€ C# ์ฝ”๋“œ์˜ Name ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์š”.

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Blazor์˜ '@' ๊ธฐํ˜ธ๋Š” ๋งˆ๋ฒ•์˜ ์ง€ํŒก์ด ๊ฐ™์•„์š”. HTML ์•ˆ์—์„œ C# ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๊ฑฐ๋“ ์š”. ๋งˆ์น˜ ํ•ด๋ฆฌํฌํ„ฐ๊ฐ€ "์œ™๊ฐ€๋ฅด๋””์›€ ๋ ˆ๋น„์˜ค์‚ฌ~" ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๋Š” "@"๋ฅผ ์‚ฌ์šฉํ•ด์„œ HTML์— ๋งˆ๋ฒ•์„ ๊ฑธ์–ด์š”! ใ…‹ใ…‹ใ…‹

5. ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ์š”? 'Pages/Index.razor' ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”:

@page "/"

<h1>Welcome to Blazor!</h1>

<greeting></greeting>

<greeting name="Alice"></greeting>

์ด์ œ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ํ™ˆํŽ˜์ด์ง€๋กœ ๊ฐ€๋ณด์„ธ์š”. ์–ด๋–ค๊ฐ€์š”? ์šฐ๋ฆฌ์˜ Greeting ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‘ ๋ฒˆ ๋‚˜ํƒ€๋‚˜์ฃ ? ํ•˜๋‚˜๋Š” ๊ธฐ๋ณธ ์ด๋ฆ„ "Blazor"๋กœ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” "Alice"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ธ์‚ฌํ•˜๊ณ  ์žˆ์–ด์š”.

6. ๋™์  ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐ๊ธˆ ๋” ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”? ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”.

'Greeting.razor' ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”:

@page "/greeting"
@page "/greeting/{Name}"

<h3>Hello, @Name!</h3>

<p>Welcome to your new app.</p>

<input placeholder="Enter your name">

@code {
    [Parameter]
    public string Name { get; set; } = "Blazor";
}

์ด์ œ ๋ญ๊ฐ€ ๋‹ฌ๋ผ์กŒ๋Š”์ง€ ๋ณผ๊นŒ์š”?

  • : ์ด ์ž…๋ ฅ ํ•„๋“œ๋Š” Name ํ”„๋กœํผํ‹ฐ์™€ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ๋ผ์š”.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด, ์ธ์‚ฌ๋ง์ด ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋ผ์š”. ์ •๋ง ๋ฉ‹์ง€์ฃ ?

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ง„์งœ ๋™์ ์ธ Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์–ด์š”. ์–ด๋–ค๊ฐ€์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ HTML Template C# Code @

์œ„ ๊ทธ๋ฆผ์€ Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค˜์š”. HTML ํ…œํ”Œ๋ฆฟ๊ณผ C# ์ฝ”๋“œ๊ฐ€ '@' ๊ธฐํ˜ธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ Blazor์˜ ๋งˆ๋ฒ•์ด์—์š”! ๐Ÿ˜‰

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Blazor WebAssembly ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ ์ด๊ฑธ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•˜๊ณ  ๋ฉ‹์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ, ๋‚ ์”จ ์œ„์ ฏ, ํ˜น์€ ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ .

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ตํ•˜์„ธ์š”. ๊ฐœ๋ฐœ์€ ์—ฐ์Šต์ด ์ค‘์š”ํ•ด์š”. ๊ณ„์† ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹คํ—˜ํ•ด๋ณด์„ธ์š”. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์—ฌ๋Ÿฌ๋ถ„์€ Blazor WebAssembly ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Blazor WebAssembly์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๐Ÿ”„ Blazor WebAssembly์—์„œ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ ๐Ÿ”„

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ Blazor WebAssembly ์•ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑด ๋ชจ๋“  ์•ฑ์˜ ํ•ต์‹ฌ์ด์ฃ . ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ์”ฝ~! ๐Ÿš€

1. ์ƒํƒœ ๊ด€๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

Blazor WebAssembly์—์„œ '์ƒํƒœ'๋ž€ ๋ญ˜๊นŒ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์•ฑ์ด ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ˆ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด์šฉ, ๊ฒŒ์ž„ ์ ์ˆ˜ ๋“ฑ์ด ๋ชจ๋‘ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”.

Blazor์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํ•„๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”?

@code {
    private int count = 0;  // ์ด๊ฒŒ ์ƒํƒœ์˜ˆ์š”!

    private void IncrementCount()
    {
        count++;  // ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์š”
    }
}

์—ฌ๊ธฐ์„œ count๊ฐ€ ๋ฐ”๋กœ ์ƒํƒœ์˜ˆ์š”. IncrementCount ๋ฉ”์„œ๋“œ๋Š” ์ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ์ฃ .

2. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉํ•˜๊ธฐ

Blazor์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด์—์š”. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด C# ์ฝ”๋“œ์˜ ๋ฐ์ดํ„ฐ์™€ HTML์„ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”:

@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

์—ฌ๊ธฐ์„œ @currentCount๋Š” C# ์ฝ”๋“œ์˜ currentCount ๋ณ€์ˆ˜ ๊ฐ’์„ HTML์— ํ‘œ์‹œํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  @onclick="IncrementCount"๋Š” ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ C# ๋ฉ”์„œ๋“œ์™€ ์—ฐ๊ฒฐํ•ด์š”. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

๐Ÿ’ก ํŒ: ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ๋งˆ์น˜ ๋งˆ๋ฒ•์˜ ๋ˆ ๊ฐ™์•„์š”. C# ์ฝ”๋“œ์™€ HTML์„ ๋‹จ๋‹จํžˆ ์—ฐ๊ฒฐํ•ด์ฃผ์ฃ . ์ด ๋ˆ ๋•๋ถ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด UI๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ผ์š”. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ?

3. HTTP ์š”์ฒญ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์‹ค์ œ ์•ฑ์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ด์š”. Blazor WebAssembly์—์„œ๋Š” HttpClient๋ฅผ ์‚ฌ์šฉํ•ด HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์งœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

@page "/users"
@inject HttpClient Http

<h1>Users</h1>

@if (users == null)
{
    <p>Loading...</p>
}
else
{
    <ul>
        @foreach (var user in users)
        {
            <li>@user.Name</li>
        }
    </ul>
}

@code {
    private User[] users;

    protected override async Task OnInitializedAsync()
    {
        users = await Http.GetFromJsonAsync<user>("https://jsonplaceholder.typicode.com/users");
    }

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
</user>

์ด ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•ด์š”:

  • @inject HttpClient Http๋กœ HttpClient๋ฅผ ์ฃผ์ž…๋ฐ›์•„์š”.
  • OnInitializedAsync ๋ฉ”์„œ๋“œ์—์„œ HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์š”.
  • ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘์—๋Š” "Loading..."์„ ํ‘œ์‹œํ•˜๊ณ , ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค˜์š”.

์–ด๋•Œ์š”? ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์ฃ ? ใ…‹ใ…‹ใ…‹

4. ํผ ๋‹ค๋ฃจ๊ธฐ

์›น ์•ฑ์—์„œ ํผ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”. Blazor์—์„œ๋Š” ํผ์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ํผ์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

@page "/login"

<h3>Login</h3>

<editform model="@loginModel" onvalidsubmit="HandleValidSubmit">
    <dataannotationsvalidator></dataannotationsvalidator>
    <validationsummary></validationsummary>

    <div class="form-group">
        <label for="username">Username:</label>
        <inputtext id="username" class="form-control"></inputtext>
        <validationmessage for="@(() => loginModel.Username)"></validationmessage>
    </div>

    <div class="form-group">
        <label for="password">Password:</label>
        <inputtext id="password" class="form-control" type="password"></inputtext>
        <validationmessage for="@(() => loginModel.Password)"></validationmessage>
    </div>

    <button type="submit" class="btn btn-primary">Login</button>
</editform>

@code {
    private LoginModel loginModel = new LoginModel();

    private void HandleValidSubmit()
    {
        Console.WriteLine($"Login attempt: {loginModel.Username}");
        // ์—ฌ๊ธฐ์— ์‹ค์ œ ๋กœ๊ทธ์ธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ผ์š”
    }

    public class LoginModel
    {
        [Required]
        public string Username { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 6)]
        public string Password { get; set; }
    }
}

์ด ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์–ด์š”:

  • EditForm์„ ์‚ฌ์šฉํ•ด ํผ์„ ๋งŒ๋“ค์–ด์š”.
  • DataAnnotationsValidator๋กœ ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•ด์š”.
  • InputText๋กœ ํ…์ŠคํŠธ ์ž…๋ ฅ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , @bind-Value๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์š”.
  • ValidationMessage๋กœ ๊ฐ ํ•„๋“œ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ด์š”.

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ๋Š” Blazor WebAssembly์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์„ ๋ฐฐ์› ์–ด์š”. ์–ด๋–ค๊ฐ€์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

Blazor WebAssembly ๋ฐ์ดํ„ฐ ํ๋ฆ„ Component Server HTTP Request HTTP Response

์œ„ ๊ทธ๋ฆผ์€ Blazor WebAssembly์—์„œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ณด์—ฌ์ค˜์š”. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ๋ณด๋‚ด๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ฃ . ๊ฐ„๋‹จํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Blazor WebAssembly์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ด๊ฑธ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•˜๊ณ  ๋ฉ‹์ง„ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ, ์†Œ์…œ ๋ฏธ๋””์–ด ์•ฑ, ํ˜น์€ ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ .

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ตํ•˜์„ธ์š”. ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑด ์—ฐ์Šต์ด ํ•„์š”ํ•ด์š”. ๊ณ„์† ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์‹คํ—˜ํ•ด๋ณด์„ธ์š”. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์—ฌ๋Ÿฌ๋ถ„์€ Blazor WebAssembly ๋ฐ์ดํ„ฐ ๋งˆ์ˆ ์‚ฌ๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿง™โ€โ™‚๏ธ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Blazor WebAssembly ์•ฑ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜†

๐Ÿš€ Blazor WebAssembly ์•ฑ ์ตœ์ ํ™” ๋ฐ ๋ฐฐํฌํ•˜๊ธฐ ๐Ÿš€

๋“œ๋””์–ด ์šฐ๋ฆฌ์˜ Blazor WebAssembly ์•ฑ์ด ์™„์„ฑ๋˜์—ˆ์–ด์š”! ๐ŸŽ‰ ์ด์ œ ์ด ์•ฑ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์„ธ์ƒ์— ๊ณต๊ฐœํ•  ์ฐจ๋ก€์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ์ถœ๋ฐœ~! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

1. ์•ฑ ์ตœ์ ํ™”ํ•˜๊ธฐ

Blazor WebAssembly ์•ฑ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์•Œ์•„๋ณผ๊นŒ์š”?

  • ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ์‚ฌ์šฉํ•˜๊ธฐ: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ๋ง๊ณ , ํ•„์š”ํ•  ๋•Œ ๋กœ๋“œํ•˜์„ธ์š”.
  • ํŠธ๋ฆฌ ์‰์ดํ‚น ํ™œ์šฉํ•˜๊ธฐ: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์•ฑ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.
  • ์••์ถ• ์‚ฌ์šฉํ•˜๊ธฐ: Brotli๋‚˜ gzip ์••์ถ•์„ ์‚ฌ์šฉํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์ค„์ด์„ธ์š”.
  • ์บ์‹ฑ ์ „๋žต ์„ธ์šฐ๊ธฐ: ์ ์ ˆํ•œ ์บ์‹ฑ์œผ๋กœ ์•ฑ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์–ด์š”:

@page "/lazycomponent"

@if (shouldRender)
{
    <dynamiccomponent type="@typeof(LazyLoadedComponent)"></dynamiccomponent>
}

@code {
    private bool shouldRender;

    protected override void OnInitialized()
    {
        shouldRender = true;
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด LazyLoadedComponent๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋ผ์š”. ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์ฃ !

๐Ÿ’ก ํŒ: ์ตœ์ ํ™”๋Š” ๋งˆ์น˜ ๋‹ค์ด์–ดํŠธ ๊ฐ™์•„์š”. ๋ถˆํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ , ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ . ๊ทธ ๊ฒฐ๊ณผ ์šฐ๋ฆฌ ์•ฑ์€ ๋‚ ์”ฌํ•˜๊ณ  ๋น ๋ฅธ ๋ชธ๋งค(?)๋ฅผ ๊ฐ–๊ฒŒ ๋ผ์š”! ใ…‹ใ…‹ใ…‹

2. ์•ฑ ๋นŒ๋“œํ•˜๊ธฐ

์•ฑ์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋นŒ๋“œํ•ด์•ผ ํ•ด์š”. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

dotnet publish -c Release

์ด ๋ช…๋ น์–ด๋Š” ๋ฆด๋ฆฌ์ฆˆ ๋ชจ๋“œ๋กœ ์•ฑ์„ ๋นŒ๋“œํ•ด์š”. ์ตœ์ ํ™”๋œ ๋ฒ„์ „์˜ ์•ฑ์ด ์ƒ์„ฑ๋˜์ฃ .

3. ์ •์  ์›น ํ˜ธ์ŠคํŒ… ์‚ฌ์šฉํ•˜๊ธฐ

Blazor WebAssembly ์•ฑ์€ ์ •์  ํŒŒ์ผ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์š”. ๋”ฐ๋ผ์„œ ์ •์  ์›น ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • GitHub Pages: GitHub ์ €์žฅ์†Œ์™€ ์—ฐ๋™ํ•ด ๋ฌด๋ฃŒ๋กœ ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • Azure Static Web Apps: Microsoft Azure์˜ ์„œ๋น„์Šค๋กœ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ๋„ ์ œ๊ณตํ•ด์š”.
  • Netlify: ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ฌด๋ฃŒ ํ”Œ๋žœ๋„ ์ œ๊ณตํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค์˜ˆ์š”.
  • Firebase Hosting: Google์˜ ์„œ๋น„์Šค๋กœ, ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•œ ํ˜ธ์ŠคํŒ…์„ ์ œ๊ณตํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, GitHub Pages๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. GitHub์— ์ƒˆ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“œ์„ธ์š”.
  2. ๋นŒ๋“œ๋œ ์•ฑ ํŒŒ์ผ๋“ค์„ ์ด ์ €์žฅ์†Œ์— ํ‘ธ์‹œํ•˜์„ธ์š”.
  3. ์ €์žฅ์†Œ ์„ค์ •์—์„œ GitHub Pages๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ๋ฐฐํฌํ•  ๋ธŒ๋žœ์น˜์™€ ํด๋”๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
  4. ์งœ์ž”! ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด https://username.github.io/repository-name์— ๋ฐฐํฌ๋˜์—ˆ์–ด์š”!

์ •๋ง ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

4. PWA(Progressive Web App) ๋งŒ๋“ค๊ธฐ

Blazor WebAssembly ์•ฑ์„ PWA๋กœ ๋งŒ๋“ค๋ฉด ๋”์šฑ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐ™์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”. PWA๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์ฃ :

  • ์˜คํ”„๋ผ์ธ์—์„œ๋„ ๋™์ž‘ํ•ด์š”.
  • ํ™ˆ ํ™”๋ฉด์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

Blazor ์•ฑ์„ PWA๋กœ ๋งŒ๋“ค๋ ค๋ฉด, ํ”„๋กœ์ ํŠธ ํŒŒ์ผ(.csproj)์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

<serviceworkerassetsmanifest>service-worker-assets.js</serviceworkerassetsmanifest>

๊ทธ๋ฆฌ๊ณ  wwwroot ํด๋”์— manifest.json ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

{
  "name": "My Awesome Blazor App",
  "short_name": "BlazorApp",
  "start_url": "./",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#03173d",
  "icons": [
    {
      "src": "icon-512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ]
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ Blazor ์•ฑ์ด PWA๊ฐ€ ๋ผ์š”! ๐Ÿ˜Ž

Blazor WebAssembly ๋ฐฐํฌ ๊ณผ์ • Build Optimize Deploy

์œ„ ๊ทธ๋ฆผ์€ Blazor WebAssembly ์•ฑ์˜ ๋ฐฐํฌ ๊ณผ์ •์„ ๋ณด์—ฌ์ค˜์š”. ๋นŒ๋“œํ•˜๊ณ , ์ตœ์ ํ™”ํ•˜๊ณ , ๋ฐฐํฌํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜์ฃ . ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์ค‘์š”ํ•ด์š”!

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ Blazor WebAssembly ์•ฑ์ด ์„ธ์ƒ์— ๊ณต๊ฐœ๋  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”! ๐ŸŽ‰ ์–ด๋–ค๊ฐ€์š”? ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ฃ ? ใ…‹ใ…‹ใ…‹

๊ธฐ์–ตํ•˜์„ธ์š”. ๋ฐฐํฌ๋Š” ๋์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘์ด์—์š”. ์‚ฌ์šฉ์ž๋“ค์˜ ํ”ผ๋“œ ๋ฐฑ์„ ๋ฐ›์•„ ๊ณ„์†ํ•ด์„œ ์•ฑ์„ ๊ฐœ์„ ํ•˜๊ณ  ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐ€์„ธ์š”. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์ข‹์€ ๊ฐœ๋ฐœ์ž์˜ ์ž์„ธ์˜ˆ์š”!

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  Blazor WebAssembly ์•ฑ์€ ์ •๋ง ๋Œ€๋‹จํ•œ ๊ฑฐ์˜ˆ์š”. C#์œผ๋กœ ์›น ์•ฑ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋‹ˆ, ์ƒ๊ฐ๋งŒ ํ•ด๋„ ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ‘๐Ÿ‘๐Ÿ‘

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Blazor WebAssembly๋Š” ์ฒ˜์Œ์—๋Š” ์‹คํ—˜์ ์ธ ํ”„๋กœ์ ํŠธ์˜€์–ด์š”. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋œจ๊ฑฐ์šด ๊ด€์‹ฌ ๋•๋ถ„์— ์ •์‹ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋˜์—ˆ์ฃ . ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด์ œ ์ด ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ์˜ ์ผ๋ถ€๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”!

5. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ

์•ฑ์„ ๋ฐฐํฌํ•œ ํ›„์—๋Š” ์„ฑ๋Šฅ์„ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ด์š”. ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • Browser DevTools: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • Lighthouse: Google์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋กœ, ์›น ์•ฑ์˜ ์„ฑ๋Šฅ, ์ ‘๊ทผ์„ฑ, SEO ๋“ฑ์„ ๋ถ„์„ํ•ด์ค˜์š”.
  • Azure Application Insights: ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•ฑ์˜ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, Lighthouse๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ F12๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์—ด๊ณ , 'Lighthouse' ํƒญ์„ ์„ ํƒํ•˜๋ฉด ๋ผ์š”. ์ •๋ง ์‰ฝ์ฃ ?

6. ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ(CI/CD) ๊ตฌ์ถ•ํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ CI/CD ์„ค์ • ์˜ˆ์‹œ๋ฅผ ๋ณผ๊นŒ์š”?

name: Deploy to GitHub Pages

on:
  push:
    branches: [ main ]

jobs:
  deploy-to-github-pages:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET Core SDK
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 5.0.x
    - name: Publish .NET Core Project
      run: dotnet publish BlazorApp.csproj -c Release -o release --nologo
    - name: Deploy to GitHub Pages
      uses: JamesIves/github-pages-deploy-action@4.1.4
      with:
        branch: gh-pages
        folder: release/wwwroot

์ด ์„ค์ •์„ .github/workflows/main.yml ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋ฉด, main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์•ฑ์ด ๋นŒ๋“œ๋˜๊ณ  GitHub Pages์— ๋ฐฐํฌ๋ผ์š”. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

๋งˆ๋ฌด๋ฆฌ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Blazor WebAssembly ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ , ์ตœ์ ํ™”ํ•˜๊ณ , ๋ฐฐํฌํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ์‚ดํŽด๋ดค์–ด์š”. ์–ด๋– ์…จ๋‚˜์š”? ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•ด ๋ณด์˜€์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ํ•ด๋ณด๋‹ˆ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์ฃ ?

์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“  Blazor WebAssembly ์•ฑ์ด ์ด์ œ ์ „ ์„ธ๊ณ„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ณต๊ฐœ๋˜์—ˆ์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘

์•ž์œผ๋กœ๋„ ๊ณ„์† ํ•™์Šตํ•˜๊ณ  ์‹คํ—˜ํ•ด๋ณด์„ธ์š”. Blazor WebAssembly๋Š” ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ๊ณ„์† ๋‚˜์˜ค๊ณ  ์žˆ์ฃ . ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด ํ˜์‹ ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”. ๊ฐœ๋ฐœ์€ ์—ฌ์ •์ด์—์š”. ๋ชฉ์ ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณผ์ •์„ ์ฆ๊ธฐ๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ์–ด๋ ค์›€์ด ์žˆ๋”๋ผ๋„ ํฌ๊ธฐํ•˜์ง€ ๋ง๊ณ  ๊ณ„์† ๋„์ „ํ•ด๋ณด์„ธ์š”. ์–ธ์  ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„๋„ Blazor WebAssembly ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๋งˆ์ง€๋ง‰์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ์ปจํผ๋Ÿฐ์Šค์—์„œ ๋ฐœํ‘œ๋ฅผ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜์ด ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.

์ž, ์ด์ œ ์ •๋ง ๋์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ Blazor WebAssembly ์—ฌ์ •์ด ์ฆ๊ฒ๊ณ  ๋ณด๋žŒ์ฐผ๊ธฐ๋ฅผ ๋ฐ”๋ž„๊ฒŒ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„