0Pricing
C# Academy · 강의

Blazor 구성 요소 모델

Razor 구성 요소를 만들고 구성 요소 수명 주기를 이해하며 매개 변수와 계단식 값을 사용합니다.

Blazor 구성 요소 모델은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Blazor란 무엇인가요

Blazor를 사용하면 JavaScript 대신 C#으로 대화형 웹 사용자 인터페이스를 구축할 수 있습니다. 구성 요소는 HTML 마크업과 C# 로직을 결합한 .razor 파일에 정의합니다. Blazor는 서버(Blazor Server)에서 실행되거나 WebAssembly를 통해 브라우저에서 실행됩니다(Blazor WASM).

첫 번째 구성 요소

Razor 구성 요소는 HTML 마크업과 C#을 위한 @code 블록이 포함된 .razor 파일입니다. 구성 요소 이름이 HTML 태그 이름이 됩니다.

@* Greeting.razor *@
<h2>Hello, @Name!</h2>
<p>You have @Count messages.</p>

@code {
    [Parameter] public string Name { get; set; } = "World";
    private int Count = 5;
}

구성 요소 수명 주기

Blazor 구성 요소에는 재정의할 수 있는 후크가 있는 수명 주기가 있습니다. 가장 일반적인 후크는 OnInitializedAsync(데이터 로드)와 OnParametersSetAsync(매개 변수 변경에 대한 반응)입니다.

@code {
    private List<Product> Products = new();

    protected override async Task OnInitializedAsync()
    {
        // Called once on first render
        Products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
    }

    protected override async Task OnParametersSetAsync()
    {
        // Called whenever parameters change
        await LoadDataAsync();
    }
}

매개 변수: 구성 요소에 데이터 전달

부모 구성 요소에서 데이터를 받으려면 속성에 [Parameter]를 지정하십시오. 매개 변수는 렌더링 전에 설정되며 변경되면 다시 렌더링을 트리거할 수 있습니다.

@* ProductCard.razor *@
<div class="card">
    <h4>@Product.Name</h4>
    <p>Price: @Product.Price.ToString("C")</p>
    <button @onclick="AddToCart">Add to Cart</button>
</div>

@code {
    [Parameter, EditorRequired]
    public Product Product { get; set; } = default!;

    [Parameter]
    public EventCallback<Product> OnAddToCart { get; set; }

    private async Task AddToCart() =>
        await OnAddToCart.InvokeAsync(Product);
}

계단식 매개 변수

계단식 매개 변수는 모든 중간 수준을 거쳐 명시적으로 전달하지 않아도 구성 요소 트리를 따라 내려갑니다. 따라서 테마, 사용자 정보 또는 공유 상태에 적합합니다.

@* App.razor — wraps the whole app *@
<CascadingValue Value="CurrentUser">
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            <RouteView RouteData="routeData" DefaultLayout="@typeof(MainLayout)" />
        </Found>
    </Router>
</CascadingValue>

@* Anywhere in the tree: *@
@code {
    [CascadingParameter]
    public UserInfo CurrentUser { get; set; } = default!;
}

목록 및 조건부 렌더링

동적 콘텐츠를 렌더링하려면 Razor 지시문 @if, @foreach, @for를 사용하십시오. 효율적인 차이 계산을 위해 목록 항목에는 항상 @key를 지정하십시오.

@if (Products.Count == 0)
{
    <p>No products found.</p>
}
else
{
    <ul>
        @foreach (var product in Products)
        {
            <li @key="product.Id">
                <ProductCard Product="product" OnAddToCart="HandleAdd" />
            </li>
        }
    </ul>
}

RenderFragment와 ChildContent

마크업을 매개 변수로 전달하려면 RenderFragment를 사용하십시오. 이는 Vue의 슬롯이나 React의 자식 요소와 비슷합니다. 일반적으로 사용하는 매개 변수 이름은 ChildContent입니다.

@* Panel.razor *@
<div class="panel">
    <div class="panel-header">@Title</div>
    <div class="panel-body">@ChildContent</div>
</div>

@code {
    [Parameter] public string Title { get; set; } = "";
    [Parameter] public RenderFragment? ChildContent { get; set; }
}

@* Usage: *@
<Panel Title="Order Details">
    <p>Order #42 — Shipped</p>
</Panel>

@ref를 사용한 구성 요소 참조

부모 구성 요소에서 자식 구성 요소의 공용 메서드를 호출하거나 속성을 읽으려면 @ref를 사용해 해당 구성 요소에 대한 참조를 캡처하십시오.

@* Parent.razor *@
<ConfirmDialog @ref="_dialog" OnConfirm="DeleteOrder" />
<button @onclick="() => _dialog!.Show()">Delete Order</button>

@code {
    private ConfirmDialog? _dialog;

    private async Task DeleteOrder()
    {
        await OrderService.DeleteAsync(CurrentOrderId);
        // Refresh UI...
    }
}

StateHasChanged와 수동 다시 렌더링

Blazor는 이벤트 처리기 실행 후 자동으로 다시 렌더링합니다. 이벤트 처리기 외부에서 발생하는 async 상태 변경(예: 백그라운드 타이머에 의한 변경)의 경우 StateHasChanged()를 수동으로 호출하십시오.

@implements IDisposable

<p>Time: @CurrentTime</p>

@code {
    private string CurrentTime = "";
    private Timer? _timer;

    protected override void OnInitialized()
    {
        _timer = new Timer(_ =>
        {
            CurrentTime = DateTime.Now.ToString("HH:mm:ss");
            InvokeAsync(StateHasChanged); // thread-safe re-render
        }, null, 0, 1000);
    }

    public void Dispose() => _timer?.Dispose();
}

성능을 위한 ShouldRender

불필요한 다시 렌더링을 건너뛰려면 ShouldRender()를 재정의하십시오. 구성 요소의 출력이 변경되지 않을 때 false를 반환하면 차이 계산에 드는 오버헤드를 줄일 수 있습니다.

@code {
    private string _lastRenderedStatus = "";

    [Parameter] public string Status { get; set; } = "";

    protected override bool ShouldRender()
    {
        // Only re-render if Status actually changed
        if (Status == _lastRenderedStatus) return false;
        _lastRenderedStatus = Status;
        return true;
    }
}

실전: 상품 목록 구성 요소

초기화할 때 데이터를 로드하고 로딩 상태를 처리하며 이벤트를 부모에게 전달하는 완전한 상품 목록 구성 요소입니다.

@inject HttpClient Http

@if (_loading)
{
    <p>Loading products...</p>
}
else
{
    @foreach (var p in _products)
    {
        <ProductCard Product="p" OnAddToCart="AddToCart" />
    }
}

@code {
    private List<Product> _products = new();
    private bool _loading = true;

    [Parameter] public EventCallback<Product> OnCartUpdated { get; set; }

    protected override async Task OnInitializedAsync()
    {
        _products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
        _loading = false;
    }

    private async Task AddToCart(Product p) => await OnCartUpdated.InvokeAsync(p);
}

빠른 확인

Blazor 구성 요소가 초기화될 때 API에서 데이터를 로드하기에 가장 적합한 수명 주기 메서드는 무엇입니까?

요약: Blazor 구성 요소 모델

핵심 내용:

  • .razor 파일은 HTML 마크업과 @code 블록의 C#을 함께 사용합니다
  • [Parameter]는 부모의 데이터를 받고 EventCallback은 이벤트를 상위로 전달합니다
  • CascadingParameter는 속성을 반복해서 전달하지 않아도 데이터를 아래로 전달합니다
  • RenderFragment/ChildContent는 조합 가능한 슬롯 기반 구성 요소를 만듭니다
  • 초기 데이터 로드에는 OnInitializedAsync를 사용하고 수동 다시 렌더링에는 StateHasChanged를 사용합니다
  • ShouldRender()는 성능을 위해 불필요한 차이 계산을 건너뜁니다

자주 묻는 질문

“Blazor 구성 요소 모델” 강의는 무료인가요?

네 — “Blazor 구성 요소 모델” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Blazor 구성 요소 모델”에서 뭘 배우나요?

Razor 구성 요소를 만들고 구성 요소 수명 주기를 이해하며 매개 변수와 계단식 값을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“Blazor 구성 요소 모델” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Blazor 구성 요소 모델
  2. 데이터 바인딩과 이벤트 처리
  3. 구성 요소 통신과 DI
  4. Blazor의 상태 관리
← C# Academy(으)로 돌아가기