Skip to content

LimChaeJune/BlazorTutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

70 Commits
ย 
ย 

Repository files navigation

๋ธ”๋ ˆ์ด์ € ๋“€ํ† ๋ฆฌ์–ผ

1. Blazor๋ž€?

Blazor is a free and open-source web framework that enables developers to create web apps using C# and HTML. It is being developed by Microsoft.

  • ๊ฐœ์š”

    Blazor๋Š” HTML, CSS๋ฅผ ์ด์šฉํ•ด ์›น UI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , Javascript๋Œ€์‹  C#์„ ์ด์šฉํ•œ ๋™์  ์›น UI๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” .NET Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ASP.NET Core์„ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  HTML๊ณผ C#์˜ ๊ฒฐํ•ฉ์œผ๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ”์ธ๋”ฉํ•˜๊ณ , UI์—…๋ฐ์ดํ„ฐ๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ธ”๋ ˆ์ด์ €๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Blazor์˜ HostingModel

Blazor์—๋Š” ๋‘ ๊ฐ€์ง€์˜ ํ˜ธ์ŠคํŒ… ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • 2.1 Blazor Web Assembly - WASM

    • WASM๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜์–ด ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ ธ๋„ ํด๋ผ์ด์–ธํŠธ ์•ฑ์€ ์˜คํ”„๋ผ์ธ์—์„œ๋„ ๊ณ„์† ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์„œ๋ฒ„๋กœ๋“œ๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด ๋“ญ๋‹ˆ๋‹ค.
    • WASM์€ ๋ฐ์Šคํฌํ†ฑ ๋ฐ ๋ชจ๋ฐ”์ผ์˜ ๋ชจ๋“  ์ตœ์‹  ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
    • WASM์€ ๋ณด์•ˆ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด ์‚ฌ์šฉ์ž ์žฅ์น˜์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • WASM์€ ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ์—†์ด ์ •์  ์‚ฌ์ดํŠธ๋กœ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (API ์ œ์™ธ)
    • blazor.webassembly.js ํ•„์š”ํ•œ ๋ชจ๋“  .NET DLL ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ฏ€๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ์„œ๋ฒ„ ์ชฝ๋ณด๋‹ค ๋А๋ ค์ง‘๋‹ˆ๋‹ค.
  • 2.2 Blazor Server

    • Server์ธก์€ HTML์†Œ์Šค๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง๋˜๊ธฐ ๋•Œ๋ฌธ์— WASM๋ณด๋‹ค ๋น ๋ฅธ ๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • C# ์ฝ”๋“œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์ธก์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— Visual Studio๋ฅผ ํ†ตํ•œ .NET ์ฝ”๋“œ ๋””๋ฒ„๊น…์ด ์ œํ•œ์ด ์ ์Šต๋‹ˆ๋‹ค.
    • WASM์€ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— IE 11๊ณผ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, Server์ธก์€ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • Server์ธก์€ ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์„ธ์…˜์„ ์„ค์ •ํ•˜๊ณ  SignalR์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” .NET๊ณผ ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU ์‚ฌ์šฉ๋Ÿ‰์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์„œ๋ฒ„ ๋น„์šฉ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • 2.3 Signal R

    Blazor์„ ์•Œ์•„๊ฐ€๋ฉด์„œ ์•ž์œผ๋กœ SignalR์ด๋ž€ ์ด๋ฆ„์„ ์ž์ฃผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
    ๊ทธ๋ž˜์„œ ๋จผ์ € ์„ค๋ช…์„ ํ•˜์ž๋ฉด SignalR์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ASP.NET ๊ฐœ๋ฐœ์ž ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    ์‹ค์‹œ๊ฐ„ ์›น ๊ธฐ๋Šฅ์ด๋ž€ ์„œ๋ฒ„ ์ธก์˜ ์ฝ”๋“œ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฝ˜ํ…Œ์ธ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋Š” ์ฆ‰์‹œ ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ์˜ ํ‘ธ์‹œ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    ์ด ์˜คํ”ˆ์†Œ์Šค๋Š” Blazor๋ฅผ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ˆ ์ด์ •๋„๋กœ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.
    SignalR ๋˜ํ•œ ์˜คํ”ˆ์†Œ์Šค์ด๋ฉฐ MSDN๊ณผ GitHub๋ฅผ ํ†ตํ•ด ๋”์šฑ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Blazor Server์™€ Blazor WASM์€ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋งŽ์€ ์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ๊ฐ€ ์—†์–ด ์ˆจ๊ธฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ - WASM
์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜์ง€์•Š๊ณ  ์‹ถ์€ ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ - Server

3. Blazor ์‹œ์ž‘ํ•˜๊ธฐ

  • Blazor ํ•„์ˆ˜์‚ฌํ•ญ
  • Blazor ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
  • Blazor Layout
  • Blazor Components
  • Blazor Binding
  • Blazor Parameter
  • Blazor Routing
  • Blazor JavaScript
  • Blazor Dependency Inject
  • Blazor Entity Framework
  • Blazor Authorize

TBD...

์œ„์˜ ๋‹จ๊ณ„๋Š” Blazor Server ํ”„๋กœ์ ํŠธ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. (์ถ”ํ›„์— WASM ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.)

  • 3.1 Blazor ํ•„์ˆ˜์‚ฌํ•ญ

    ์ด ๊ธ€์€ Windows10 Visual Studio 2019๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

    • .NET Core 2.1 SDK ๋˜๋Š” ์ดํ›„ ๋ฒ„์ „ ํ™•์ธ
    • Visual Studio 15.7 ๋˜๋Š” ์ดํ›„ ๋ฒ„์ „ ํ™•์ธ
  • 3.2. Blazor ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

    Blazor Server์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ASP.NET CORE์˜ ๊ตฌ์กฐ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

    • 3.2.1 Startup.cs

      ์•ฑ์˜ ์‹œ์ž‘ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. StartUp ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ ์‹œ์— ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

      • ConfigureServices: ์•ฑ์˜ DI(Depedency Inject) ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. (ex: DBContenxt, Authorize, API, Service ๋“ฑ) Blazor Server์—์„œ๋Š” AddServerSideBlazor ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค(AddSigleton , AddScoped, AddTransient)๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ Service๊ฐ€ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ฑ์˜ Service ์ปจํ…Œ์ด๋„ˆ์— ์ถ”๊ฐ€๋˜๋ฉด์„œ Component์—์„œ Service๋ฅผ Injectํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • Configure: ์•ฑ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

        ์ดˆ๊ธฐ StartUp.cs์˜ ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
        Startup.cs

        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
        
            public IConfiguration Configuration { get; }
        
            // This method gets called by the runtime. Use this method to add services to the container.
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddRazorPages();
                services.AddServerSideBlazor();
                // ์•ฑ์˜ Dependency Inject ์ข…์†์„ฑ ์ฃผ์ž… -- ์ด ๊ฐœ๋…์€ ์•„๋ž˜์— ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.
                services.AddSingleton<WeatherForecastService>();
            }
        
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // ์•ฑ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋์„ ๋•Œ ํ™”๋ฉด
                    app.UseExceptionHandler("/Error");
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
        
                app.UseHttpsRedirection();
                app.UseStaticFiles();
        
                app.UseRouting();
        
                app.UseEndpoints(endpoints =>
                {
                    // ๋ธŒ๋ผ์šฐ์ €์™€์˜ ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์€ SignalR๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
                    endpoints.MapBlazorHub();
                    // ์•ฑ์˜ ๋ฃจํŠธ ํŽ˜์ด์ง€๋ฅผ ์„ค์ •ํ•˜๊ณ  ํƒ์ƒ‰์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. 
                    endpoints.MapFallbackToPage("/_Host");
                });
            }
        }
    • 3.2.2 Program.cs

      ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ง„์ž…์ ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ASP.NET Core๋ฅผ ํ˜ธ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

    • 3.2.3 Pagesํด๋”

      Blazor ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ผ์šฐํŒ… ๊ฐ€๋Šฅํ•œ Razor ํŽ˜์ด์ง€์™€ Blazor ์„œ๋ฒ„ ์•ฑ ๋ฃจํŠธ Razor ํŽ˜์ด์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

      ๊ฐ ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋Š” @page ์ง€์‹œ๋ฌธ์„ ์ด์šฉํ•ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      @page "/๊ฒฝ๋กœ์ด๋ฆ„"
      

      Blazor Server ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ Pages์˜ ํด๋”์˜ ํ…œํ”Œ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • _Host.cshtml: Razor ํŽ˜์ด์ง€๋กœ ๊ตฌํ˜„๋œ ์•ฑ์˜ ๋ฃจํŠธ ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค
        • ์•ฑ์˜ ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ์š”์ฒญ๋˜๋ฉด ์ด ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜๋ฉฐ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
        • ๋ฃจํŠธ App์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        • ๊ธฐ๋ณธ์ ์œผ๋ก  _framework/blazor.server.js Javascript ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์‹ค์‹œ๊ฐ€ SignalR ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” JS์ž…๋‹ˆ๋‹ค.
        • ์ƒˆ๋กœ ์ƒ์„ฑํ•œ jsํ˜น์€ css, Api ์šฉ๋„์˜ js ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • Counter.razor: Blazor ๊ตฌ์„ฑ์š”์†Œ Razor ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์นด์šดํŠธ ์ฆ๊ฐ€๊ฐ€ ๊ตฌํ˜„๋œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
      • Error.cshtml: App์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.
      • FetchData.razor: StartUp.cs์—์„œ DI๋กœ ๋“ฑ๋ก๋œ Service๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๊ตฌํ˜„๋œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.
      • Index.razor: ํ™ˆ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. ์—ฌ๋А ๋‹ค๋ฅธ ์›น ๊ฐœ๋ฐœ Index ํŽ˜์ด์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • 3.2.4 Properties/launchSettings.json

      ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ๊ฐ€์ง„ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

      • ASP.NET Core์˜ launchSettings.json ํŒŒ์ผ๊ณผ ๊ฐ™์œผ๋ฉฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ์„ค์ •๋œ ๊ฐ’์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋กœ์ปฌ ๊ฐœ๋ฐœ ๋จธ์‹ ์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
      • ๋ฐฐํฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœํ•„ ์„ค์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • 3.2.5 Sharedํด๋”

      razorํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต UI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

      • MainLayout.razor: ์•ฑ์˜ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ์š”์†Œ ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ž์„ธํ•œ ์„ค๋ช…์ด์žˆ์Šต๋‹ˆ๋‹ค.
      • NavMenu.razor: ์‚ฌ์ด๋“œ ๋ฐ” Navigation์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Razor ์‰‰์š”์†Œ์— ๋Œ€ํ•œ ํƒ์ƒ‰ ๋งํฌ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” NavLink๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ASP.NET Core์˜ NavLink์™€ ๊ฐ™์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ํ‘œ์‹œ๋œ ํƒ์ƒ‰ ๋งํฌ ์ค‘ ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ํ™œ์„ฑ ํŽ˜์ด์ง€์ธ์ง€์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, NavLink.ActiveClass์— CSS ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ• ๋‹นํ•˜์—ฌ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•ด ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • 3.2.6 __Import.razor

      .razor์™€ ๊ฐ™์€ ์•ฑ์˜ ๊ตฌ์„ฑ์š”์†Œ์— ํฌํ•จํ•  ๊ณตํ†ต ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ @Using ์ง€์‹œ๋ฌธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

    • 3.2.7 Data ํด๋”

      ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Database์˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ํด๋”์ž…๋‹ˆ๋‹ค. Blazor Server์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • WeatherForecast.cs: Property ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋‹ด์€ ํด๋ž˜์Šค
      • WeatherForecastService.cs: Data๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Task ๋ฉ”์†Œ๋“œ๋ฅผ ๋‹ด์€ ํด๋ž˜์Šค
    • 3.2.8 wwwroot

      ์•ฑ์˜ ๊ณต๊ฐœ ์ •์  ์š”์†Œ๋“ค์ด ํฌํ•จ๋œ Web root์ž…๋‹ˆ๋‹ค.

    • 3.2.9 appsetting.json

      ์•ฑ์˜ ๊ตฌ์„ฑ ์„ค์ •์„ ์ €์žฅํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

      • IConfiguration ์ธ์Šคํ„ด์Šค๋ฅผ Razor ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฝ์ž…ํ•ด ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • API, Authorize, DataBase ConnectionString ๋“ฑ์˜ ์ธ์ฆ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • 3.3. Blazor Layout

    ๋ธ”๋ ˆ์ด์ €๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•˜๋ฉด SharedํŒŒ์ผ์˜ MainLayout.razor์—์„œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์„œ Page์˜ Layout Template์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Blazor Layout์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋Š” LayoutComponent Class์˜ ํ•˜์œ„ ํ•ญ๋ชฉ ์“ฐ์ž…๋‹ˆ๋‹ค.
    Blazor Layout์€ Index.razor ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ •์˜ ๋œ ๋ถ€๋ถ„๋งŒ ์ž‘๋™ ๋ฉ๋‹ˆ๋‹ค. (Blazor Server๋งŒ ํฌํ•จ)

    MainLayout.razor

    @inherits LayoutComponentBase
    <div class="sidebar">
        <NavMenu />
    </div>
    
    <div class="main">
        <div class="top-row px-4">
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @Body  //์ด๊ณณ์˜ Index.razor๋‚ด์˜ ์ •์˜๋œ HTML๋“ค์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
        </div>
    </div>
  • 3.4. Blazor Component

    Component๋Š” C# HTML ํƒœ๊ทธ ์กฐํ•ฉ์œผ๋กœ Blazor Razor ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

    • 3.4.1 ๊ฐœ์š”

      • Razor ๊ตฌ๋ฌธ

        Blazor์˜ Razor ๊ตฌ์„ฑ ์š”์†Œ๋Š” Razor ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Razor ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด MSDN Razor ๊ตฌ๋ฌธ ์ฐธ์กฐ์„ ์ฐธ๊ณ ํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

      • ์ž‘๋ช…

        Component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ ํ•ด์•ผ๋ฉ๋‹ˆ๋‹ค. ex) BlazorComponent.razor

      • Routing

        Blazor์˜ ๋ผ์šฐํŒ…์€ ์•ฑ์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ฒฝ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
        @page ์ง€์‹œ๋ฌธ์ด ์žˆ๋Š” Razor ํŒŒ์ผ์ด ์ปดํŒŒ์ผ๋˜๋ฉด ์ƒ์„ฑ ๋œ ํด๋ž˜์Šค์— ๊ฒฝ๋กœ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•˜๋Š” RouteAttribute ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์‹œ ๋ผ์šฐํ„ฐ๋Š” RouteAttribute๊ฐ€ ์žˆ๋Š” Component์˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ๊ณ  ์š”์ฒญ ๋œ URL๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์˜ Component๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
        BlazorComponent.razor

        @page "/BlazorComponent"        
      • Markup(HTML)

        Component์˜ UI๋Š” HTML์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋ฉ๋‹ˆ๋‹ค. Razor๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— C# ๊ตฌ๋ฌธ์„ ์ด์šฉํ•œ ๋™์  ๋ Œ๋”๋ง ๋…ผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ์ปดํŒŒ์ผ๋˜๋ฉด HTML ํƒœ๊ทธ์™€ C# ๋ Œ๋”๋ง ๋…ผ๋ฆฌ๊ฐ€ Component์˜ ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

        Component ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ์€ @code ๋ธ”๋ก ๋‚ด์—์„œ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

        @code ๋ธ”๋ก์—์„œ๋Š” Property, Fields ๋“ฑ๊ณผ ๊ทธ๊ฒƒ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” Event์™€ Method๋“ค์„ ํฌํ•จ ํ•ฉ๋‹ˆ๋‹ค.

        ๋‹ค์Œ์€ ๋™์  ๋ Œ๋”๋ง ์˜ˆ ์ž…๋‹ˆ๋‹ค.

        DynamicRender.razor

        <div class="@(visibllity ? "visible" : "collapse")">
          @text1
        </div>
        
        @code{
          private bool visibllity { get; set;} = false;
          private string text1 { get; set; } = "my sample text.";
        }
      • NameSpace

        Component์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” ์•ฑ์˜ ๋ฃจํŠธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์™€ ์•ฑ ๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ์œ„์น˜์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ๋ฃจํŠธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ BlazorTutorial์ด๊ณ  ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ์ด Pages์— ์žˆ๋Š” ๊ฒฝ์šฐ

        • BlazorTutorial.Pages์ด๋ž€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

        ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํด๋”์˜ @using์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์•ฑ์˜ _Imports.razor ํŒŒ์ผ์— ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.

      • Partial Class ์ง€์›

        Razor ๊ตฌ์„ฑ ์š”์†Œ๋Š” C# ์ฝ”๋“œ๋ฅผ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        • Razor ์ฝ”๋“œ์™€ HTML ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” Razor ๊ตฌ์„ฑ์š”์†Œ์˜ @code ๋ธ”๋ก ์„ ๋งŒ๋“ค์–ด ์•ˆ์— C# ์„ ์ •์˜

        Pages/Counter.razor

        <div class="@(visibllity ? "visible" : "collapse")">
          @text1
        </div>
        
        @code{
            private int currentCount = 0;
            
            void PlusCount()
            {
              currentCount++;
            }
        }
        • ์ฝ”๋“œ ์ˆจ๊น€ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด C# ์„ ์ •์˜ (RazorํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋ฅผ .razor๋ฅผ ํฌํ•จํ•ด ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.)

        Pages/Counter.razor

        <div class="@(visibllity ? "visible" : "collapse")">
          @text1
        </div>

        Pages/Counter.razor.cs

        @code{
          namespace BlazorTutorial.Pages
          {
              public partial class Counter
              {
                  private int currentCount = 0;
                  
                  void PlusCount()
                  {
                    currentCount++;
                  }
              },
          }                   
      • ๊ธฐ๋ณธํด๋ž˜์Šค ์ง€์ •

        Razor ํŒŒ์ผ ์•ˆ์— @inherits Attribute๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • ๊ตฌ์„ฑ์š”์†Œ ๋งค๊ฐœ๋ณ€์ˆ˜

        Component๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ถ€๋ชจ Component์—์„œ ์ž์‹ Component์— ๋Œ€ํ•ด Parameter๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        Pages/Parent.razor.cs

          <Child childParmas = 123 />

        Pages/Child.razor.cs

          <div>
            @childParamas.ToString()
          </div>
          
          @code{
            [Parameter] Public int childParams { get; set; }
          }

About

This Repository Has Blazor Description and Examples

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •