μ΄ μΈμ μμλ λΈλ μ΄μ λ₯Ό μ΄μ©νμ¬ νΌμ κ°κ² μ±μ λ§λ€ κ²μ λλ€. μ΄ μ±μ μ¬μ©μκ° νΌμλ₯Ό μ£Όλ¬Ένκ³ ν νμ λ³κ²½ν μ μμΌλ©° μ£Όλ¬Έ λ°°λ¬μ μΆμ ν μ μμ΅λλ€.
μ΄ λ ν¬μ§ν 리μ νΌμ κ°κ² μ±μ μν μ΄κΈ° μ루μ μ μ€λΉνμμ΅λλ€. μ΄μ λ ν¬μ§ν 리λ₯Ό 볡μ¬νμΈμ. "save-points" ν΄λμ κ° μΈμ λ³λ‘ μ€λΉκ° λμ΄ μμ΅λλ€. starting pointλ₯Ό μ°Ύμ보μΈμ.
Note: μ΄ μν¬μ΅ μ½λλ₯Ό μμ€ν μ λ€λ₯Έ μμΉμ 볡μ¬νλ κ²½μ°, λ ν¬μ§ν 리 rootμ μλ Directory.Build.props νμΌλ ν¨κ» 볡μ¬ν΄μΌ ν©λλ€.
μ΄ μ루μ
μ 4κ°μ νλ‘μ νΈλ₯Ό μ΄λ―Έ ν¬ν¨νκ³ μμ΅λλ€.

-
BlazingPizza.Client: λΈλ μ΄μ νλ‘μ νΈ μ λλ€. μ± UI μ»΄ν¬λνΈκ° ν¬ν¨λμ΄ μμ΅λλ€.
-
BlazingPizza.Server: λΈλ μ΄μ μ±μ νΈμ€ν νλ ASP.NET Core νλ‘μ νΈμ΄λ©° μ΄ μ±μ λ°±μλ μλΉμ€μ λλ€.
-
BlazingPizza.Shared: μ΄ μ±μμ 곡μ νλ μ½λκ° ν¬ν¨λ νλ‘μ νΈμ λλ€.
-
BlazingPizza.ComponentsLibrary: μ΄ν μΈμ μμ μ¬μ©λ μ»΄ν¬λνΈμ ν¬νΌμ½λ λΌμ΄λΈλ¬λ¦¬μ λλ€.
BlazingPizza.Server νλ‘μ νΈκ° μμ νλ‘μ νΈλ‘ μ€μ λμ΄μΌ ν©λλ€.
μ±μ μ€ννλ©΄ νμ¬λ λ¨μν ννμ΄μ§κ° νμλ κ²μ λλ€.
μ΄ ν νμ΄μ§μ μ½λλ₯Ό 보기 μν΄ BlazingPizza.Client νλ‘μ νΈμ μλ Pages/Index.razor νμΌμ μ΄μ΄λ³΄μΈμ.
@page "/"
<h1>Blazing Pizzas</h1>
μ΄ ννμ΄μ§λ λ¨μΌ μ»΄ν¬λνΈλ‘ ꡬνλμ΄ μμ΅λλ€. @page μ§μλ¬Έμ Index μ»΄ν¬λνΈκ° νΉμ κ²½λ‘μ λΌμ°ν
κ°λ₯ν νμ΄μ§μμ μ§μ ν©λλ€.
첫 λ²μ§Έλ‘ ννμ΄μ§μ μ£Όλ¬Έ κ°λ₯ν νΌμ λ©λ΄λ₯Ό νμνλ κ²λΆν° μ§νν κ²μ
λλ€. μ΄ λͺ©λ‘μ Index μ»΄ν¬λνΈ μνμ ν¬ν¨λ©λλ€.
Index.razor νμ΄μ§μ λ©λ΄ λͺ©λ‘μ μ μ₯ν λͺ©λ‘ νλλ₯Ό μ μ₯ν μ½λλ₯Ό @code λΈλμΌλ‘ μΆκ°ν΄ μ£ΌμΈμ.
@code {
List<PizzaSpecial> specials;
}@code λΈλμμ μ½λλ μ»΄ν¬λνΈλ₯Ό μν΄ μμ±λ ν΄λμ€μ μΆκ°λ©λλ€. PizzaSpecial νμ
μ BlazingPizza.Sharedμ μ΄λ―Έ μ μλμ΄ μμ΅λλ€.
λ©λ΄ λͺ©λ‘μ μ»μ λ €λ©΄ λ°±μλμ APIλ₯Ό νΈμΆν΄μΌ ν©λλ€. λΈλ μ΄μ λ κΈ°λ³Έκ°μΌλ‘ μ΄λ―Έ μ€μ λ HttpClientλ₯Ό μμ‘΄μ± μ£Όμ
μ ν΅ν΄ μ 곡ν©λλ€. @inject μ§μμ΄λ₯Ό μ¬μ©νμ¬ Index μ»΄ν¬λνΈμ HttpClientλ₯Ό μ£Όμ
ν©λλ€.
@page "/"
@inject HttpClient HttpClient
@inject μ§μλ¬Έμ κΈ°λ³Έμ μΌλ‘ μμ± μ νκ³Ό μμ± μ΄λ¦μ μ§μ νλ κ²μΌλ‘ μ»΄ν¬λνΈμ μ μμ±μ μ μν©λλ€. μ΄ μμ±μ μ’
μμ± μ£Όμ
μ ν΅ν΄ μ 곡 λ©λλ€.
νΌμ λ©λ΄ λͺ©λ‘μ λ°κΈ° μν΄ @code λΈλμ OnInitializedAsync λ©μλλ₯Ό μ¬μ μν©λλ€. μ΄ λ©μλλ μ»΄ν¬λνΈ μλͺ
μ£ΌκΈ°μ μΌλΆλ‘ μ»΄ν¬λνΈκ° μ΄κΈ°νλκ³ λμ νΈμΆλ©λλ€. μλ΅μΌλ‘ μ¨ JSONμ μμ§λ ¬ννκΈ° μν΄ GetFromJsonAsync<T>() λ©μλλ₯Ό μ΄μ©ν©λλ€.
@code {
List<PizzaSpecial> specials;
protected override async Task OnInitializedAsync()
{
specials = await HttpClient.GetFromJsonAsync<List<PizzaSpecial>>("specials", BlazingPizza.OrderContext.Default.ListPizzaSpecial);
}
}/specials APIλ minimal APIλ‘ μ μλμ΄ μμΌλ©° BlazingPizza.Server νλ‘μ νΈμ PizzaApiExtensions.csνμΌμμ νμΈνμ€ μ μμ΅λλ€.
minimal APIμ κ΄λ ¨ν μμΈ λ΄μ©μ ASP.NET Coreλ₯Ό μ¬μ©νμ¬ μ΅μ API λ§λ€κΈ°λ₯Ό μ°Έκ³ νμΈμ.
Note:
BlazingPizza.OrderContext.Default.ListPizzaSpecialλ source generatorsλ‘ JSONμ μ§λ ¬νν κ²μ λλ€.
μ»΄ν¬λνΈκ° μ΄κΈ°νλλ©΄ λ§ν¬μ
μ΄ λ λλ§λ©λλ€. Index μ»΄ν¬λνΈμ λ§ν¬μ
μ μλμ κ°μ΄ νΌμ λ©λ΄ λͺ©λ‘μ νμνλλ‘ μμ ν΄ μ£ΌμΈμ.
<div class="main">
<ul class="pizza-cards">
@if (specials != null)
{
@foreach (var special in specials)
{
<li style="background-image: url('@special.ImageUrl')">
<div class="pizza-info">
<span class="title">@special.Name</span>
@special.Description
<span class="price">@special.GetFormattedBasePrice()</span>
</div>
</li>
}
}
</ul>
</div>Ctrl-F5λ₯Ό λλ¬ μ±μ μ€νν΄ μ£ΌμΈμ. μ΄μ μ£Όλ¬Έ κ°λ₯ν λ©λ΄ λͺ©λ‘μ΄ λ³΄μΌ κ²μ
λλ€.
λ€μμΌλ‘ μ±μ λ μ΄μμμ λ§λλλ€.
λΈλ μ΄μ μ λ μ΄μμ μμ μ»΄ν¬λνΈμ
λλ€. λ μ΄μμμ λ³Έλ¬Έμ λ λλ§ν μ μλ Bodyλ₯Ό μ μνλ LayoutComponentBaseλ‘λΆν° μμλ©λλ€. μ°λ¦¬κ° μ¬μ©ν νΌμ κ°κ² μ±μ λ μ΄μμ μ»΄ν¬λνΈλ Shared/MainLayout.razor νμΌμ μ μλμ΄ μμ΅λλ€.
@inherits LayoutComponentBase
<div class="content">
@Body
</div>λ μ΄μμμ΄ νμ΄μ§μ μ΄λ»κ² μ°κ΄λμ΄ μλμ§ λ³΄λ €λ©΄ App.razor νμΌμ <Router> μ»΄ν¬λνΈλ₯Ό μ΄ν΄λ³΄μΈμ. DefaultLayout λ§€κ° λ³μλ λ μ΄μμμ μ§μ νμ§ μμ νμ΄μ§μ μ¬μ©λλ λ μ΄μμμ κ²°μ ν©λλ€.
νμ΄μ§ λ¨μλ‘ DefaultLayoutλ₯Ό μ¬μ μν μ μμ΅λλ€. μ΄λ₯Ό μν΄μλ .razor νμ΄μ§ μ»΄ν¬λνΈ λ§¨ μμ @layout SomeOtherLayout κ°μ μ§μλ¬Έμ μΆκ°ν μ μμ΅λλ€.
MainLayout μ»΄ν¬λνΈλ₯Ό μμ νμ¬ ννμ΄μ§μ νμ λ§ν¬μ λΈλλ λ‘κ³ κ° μλ μλ¨ λ©λ΄λ₯Ό μΆκ°ν΄ μ£ΌμΈμ.
@inherits LayoutComponentBase
<div class="top-bar">
<a class="logo" href="">
<img src="img/logo.svg" />
</a>
<NavLink href="" class="nav-tab" Match="NavLinkMatch.All">
<img src="img/pizza-slice.svg" />
<div>Get Pizza</div>
</NavLink>
</div>
<div class="content">
@Body
</div>λΈλ μ΄μ λ NavLink μ»΄ν¬λνΈλ₯Ό μ 곡ν©λλ€. μ»΄ν¬λνΈλ μ»΄ν¬λνΈμ νμ
μ΄λ¦κ³Ό λ§€κ° λ³μλ₯Ό μμ±μΌλ‘ μ§μ νμ¬ μ¬μ©ν μ μμ΅λλ€.
NavLink μ»΄ν¬λνΈλ νμ¬ URLμ΄ λ§ν¬μ μ£Όμμ μΌμΉν λ active ν΄λμ€λ₯Ό μΆκ°νλ κ²μ μ μΈνλ©΄ μ΅μ»€ νκ·Έμ λμΌν©λλ€. NavLinkMatch.Allμ μ 체 URL(URL Prefixλ§μ΄ μλ)μ΄ μΌμΉνμμ λλ§ λ§ν¬κ° νμ±νλμ΄μΌ νλ κ²μ μλ―Έν©λλ€. NavLinkμ μμΈν λ΄μ©μ μ΄ν μΈμ
μμ λ μμΈν λ€λ£¨κ² μ΅λλ€.
Ctrl-F5λ₯Ό λλ¬ μ±μ μ€νν΄ μ£ΌμΈμ. μλ‘μ΄ λ μ΄μμμ΄ μ μ©λμ΄ νΌμ κ°κ² μ±μ΄ μλ μ΄λ―Έμ§μ κ°μ΄ λ³΄μΌ κ²μ
λλ€.
λ€μ μΈμ - λ΄ νΌμ λ§λ€κΈ°
μλ¬Έ μ½κΈ° - Components and Layout


