Blazor Fundamentals
Blazor Server 기초 입문 강의 목차
소개 및 개요
- Blazor 소개
- Blazor Server와 Blazor WebAssembly 비교
- 강의 목표 및 구성
개발 환경 설정 및 프로젝트 생성
- Visual Studio 설치
- .NET 7.0 SDK 설치
- Blazor 템플릿 설치
- Blazor Server 프로젝트 생성
- 프로젝트 구조 및 주요 파일 설명
Razor 컴포넌트 및 구문 이해
- Razor 구문 이해하기
- 컴포넌트 구조 및 생명주기 이해하기
- 데이터 바인딩 및 이벤트 처리
라우팅 및 상태 관리
- Blazor 라우팅 개념
- 페이지 라우팅 및 매개변수 전달
- 네비게이션 매니저 활용
- 상태 관리 개념
- Cascading Parameters
- Dependency Injection을 사용한 서비스 구현
폼, 유효성 검사 및 데이터 처리
- 폼 구성
- 데이터 양식 및 입력 유효성 검사
- 서버 측 유효성 검사
- Blazor Server에서 CRUD 기능 구현하기
- Blazor Server에서 REST API 호출하기
- Blazor Server에서 SignalR 사용하기
스타일링 및 JavaScript 상호 작용
- Blazor Server에서 CSS 파일 사용하기
- Blazor Server에서 Bootstrap 사용하기
- Blazor Server에서 CSS Framework 사용하기
- JavaScript Interop 소개
- JavaScript 함수 호출하기
- .NET 메서드 호출하기
데이터 액세스 및 Entity Framework Core
- 데이터 액세스 기초
- Entity Framework Core 소개
- CRUD 작업 구현
인증 및 권한 관리
- 인증 및 권한 관리 소개
- ASP.NET Core Identity 사용하기
- 권한 기반 인가
성능 최적화 및 보안
- 성능 최적화 전략
- Blazor Server에서 lazy loading 적용하기
- Blazor Server에서 코드 분할하기
- 보안 이슈 및 대응 방안
- 추가 리소스 및 라이브러리 소개
배포 및 확장
- 배포 전략 이해
- Azure, AWS 등 클라우드 서비스를 이용한 배포
- GitHub Actions를 이용한 CI/CD 파이프라인 구성
- Blazor Server에서 Custom 컴포넌트 만들기
- Blazor Server에서 Blazor WebAssembly 사용하기
- Blazor Server에서 Blazor Hybrid 앱 개발하기
실전 프로젝트
- 실전 프로젝트 개요 및 목표 설정
- 프로젝트 구현 과정
- 프로젝트 완성 및 리뷰
1. 소개 및 개요
Blazor 소개
Blazor는 Microsoft에서 개발한 웹 애플리케이션 개발 프레임워크로, C# 및 .NET을 사용하여 클라이언트 측 웹 애플리케이션을 구축할 수 있습니다. 이 프레임워크는 웹 개발에서 JavaScript의 독점을 깨고, 대안으로 사용할 수 있는 기술을 제공합니다.
Blazor Server와 Blazor WebAssembly 비교
Blazor에는 Blazor Server와 Blazor WebAssembly 두 가지 호스팅 모델이 있습니다.
Blazor Server:
- 서버에서 애플리케이션 로직을 실행하며, UI 업데이트를 클라이언트와 실시간으로 소통합니다.
- 사용자의 브라우저에서 실행되는 코드가 적기 때문에 초기 로딩 시간이 짧습니다.
- 서버와 클라이언트 간의 실시간 통신에 의존하므로, 네트워크 지연 시간에 민감합니다.
Blazor WebAssembly:
- 웹 브라우저에서 실행되는 WebAssembly 기술을 기반으로 합니다.
- 애플리케이션 로직이 클라이언트에서 실행되므로, 서버에 부담을 주지 않습니다.
- 모든 코드가 브라우저에 로드되어야 하기 때문에 초기 로딩 시간이 길 수 있습니다.
두 모델 모두 C# 및 Razor 구문을 사용하여 개발할 수 있으며, 각각의 장단점에 따라 애플리케이션의 요구 사항에 맞게 선택할 수 있습니다.
강의 목표 및 구성
이 강의의 목표는 Blazor Server 7.0 기초 개념을 이해하고, 간단한 애플리케이션을 구축하는 데 필요한 기술을 배울 수 있도록 하는 것입니다. 강의는 아래와 같이 구성됩니다.
- Blazor Server 소개 및 개요
- 개발 환경 설정
- Blazor Server 기본 개념 이해하기
- 데이터 처리 및 폼 관리
- 외부 데이터 사용
- 스타일링 및 성능 최적화
- 배포 및 확장
- 실전 프로젝트 구현
2. 개발 환경 설정 및 프로젝트 생성
Visual Studio 설치
- Visual Studio 공식 홈페이지(https://visualstudio.microsoft.com/)에서 Visual Studio를 다운로드합니다.
- 설치 프로그램을 실행하고, 워크로드에서 ASP.NET 및 웹 개발을 선택합니다.
- 설치를 완료한 후 Visual Studio를 실행합니다.
.NET 7.0 SDK 설치
- .NET 공식 홈페이지(https://dotnet.microsoft.com/download/dotnet/7.0)에서 .NET 7.0 SDK를 다운로드합니다.
- 설치 프로그램을 실행하여 .NET 7.0 SDK를 설치합니다.
Blazor 템플릿 설치
- Visual Studio에서 새 프로젝트를 생성하거나 기존 프로젝트를 연 후, 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔을 선택합니다.
- 패키지 관리자 콘솔에서 다음 명령어를 실행하여 Blazor 템플릿을 설치합니다.
dotnet new -i Microsoft.AspNetCore.Components.WebAssembly.Templates::7.0.0
Blazor Server 프로젝트 생성
- Visual Studio에서 파일 > 새로 만들기 > 프로젝트를 선택합니다.
- 프로젝트 유형 목록에서 Blazor Server 앱을 선택하고, 다음을 클릭합니다.
- 프로젝트 이름, 위치, 솔루션 이름을 입력한 후 만들기를 클릭합니다.
.NET CLI를 사용하여 Blazor 프로젝트 생성하기
.NET Core CLI(Command-Line Interface)는 .NET 애플리케이션의 개발, 실행 및 관리를 위한 강력한 도구입니다. 이 가이드에서는 .NET CLI를 사용하여 Blazor 프로젝트를 생성하고, 이를 실행하는 방법에 대해 자세히 설명합니다. "Hawaso"라는 이름의 프로젝트를 예로 들어보겠습니다.
.NET CLI 확인
먼저, 설치된 .NET SDK의 버전을 확인합니다. 이는 시스템에 .NET이 올바르게 설치되었는지와 사용 가능한 버전을 확인하는 데 유용합니다. 터미널이나 명령 프롬프트에서 다음 명령어를 입력합니다.
dotnet --version
이 명령은 설치된 .NET SDK의 버전 번호를 출력합니다. 만약 .NET이 설치되어 있지 않다면, Microsoft의 공식 .NET 다운로드 페이지에서 최신 버전을 설치하세요.
Blazor 프로젝트 생성
Blazor 프로젝트를 생성하기 위해, 다음 명령어를 사용합니다.
dotnet new blazor -o Hawaso
dotnet new blazor
: Blazor 프로젝트를 생성하는 명령어입니다.-o Hawaso
: 생성된 프로젝트의 출력 디렉토리를 지정합니다. 이 경우, "Hawaso"라는 이름의 폴더가 생성되며, 프로젝트 파일이 이 폴더 내에 위치하게 됩니다.
프로젝트 실행
프로젝트 폴더로 이동한 후, 프로젝트를 실행합니다. 프로젝트 실행은 빌드 과정을 포함하며, 로컬 개발 서버에서 애플리케이션을 시작합니다.
cd Hawaso
dotnet run
dotnet run
명령은 프로젝트를 빌드하고 실행합니다. 명령이 성공적으로 수행되면, 터미널에 애플리케이션을 호스팅하는 로컬 서버의 주소가 출력됩니다.
실시간 변경 감지
개발 중에는 소스 코드를 변경할 때마다 애플리케이션을 다시 빌드하고 실행하는 것이 번거로울 수 있습니다. .NET watch
도구를 사용하면, 코드 변경을 실시간으로 감지하고 자동으로 애플리케이션을 재시작할 수 있습니다.
dotnet watch
dotnet watch
명령은 프로젝트 파일이나 소스 코드에 변경이 발생할 때마다 자동으로 애플리케이션을 재빌드하고 재실행합니다. 이를 통해 개발 과정을 보다 효율적으로 만들 수 있습니다.
마무리
.NET CLI는 .NET 애플리케이션 개발의 핵심 도구 중 하나로, 프로젝트 생성부터 실행, 관리까지 다양한 작업을 수행할 수 있습니다. Blazor 프로젝트를 생성하고 실행하는 과정을 통해, .NET 개발의 기본 사항을 실습해 볼 수 있습니다. dotnet watch
를 사용하면 개발 과정을 더욱 빠르고 효율적으로 진행할 수 있습니다.
프로젝트 구조 및 주요 파일 설명
Blazor Server 프로젝트의 구조는 다음과 같습니다.
- wwwroot: 정적 파일(이미지, CSS, JavaScript 파일 등)을 저장하는 폴더입니다.
- Pages: Razor 컴포넌트 페이지를 저장하는 폴더입니다.
- Shared: 공유 Razor 컴포넌트를 저장하는 폴더입니다.
- _Imports.razor: 전역적으로 사용할 네임스페이스를 정의하는 파일입니다.
- App.razor: 라우팅 및 메인 레이아웃을 정의하는 파일입니다.
- Program.cs: 애플리케이션의 시작 지점을 정의하는 파일입니다.
- Startup.cs: 애플리케이션 설정 및 의존성 주입을 구성하는 파일입니다.
이러한 구조를 이해하고 관리하면 프로젝트를 효율적으로 개발할 수 있습니다.
3. Razor 컴포넌트 및 구문 이해
Razor 구문 이해하기
Razor는 C#과 HTML을 결합한 ASP.NET의 서버 사이드 스크립팅 언어입니다. Razor 구문은 @
기호를 사용해 C# 코드와 HTML을 구분합니다.
<p>@DateTime.Now</p>
위 예제에서 @DateTime.Now
는 C# 코드이며, 현재 시간을 출력합니다. Razor 구문을 사용하면 C# 코드를 간편하게 HTML 안에 삽입할 수 있습니다.
컴포넌트 구조 및 생명주기 이해하기
Blazor에서 컴포넌트는 독립적인 UI 요소로, 화면에 표시되는 각각의 부분을 나타냅니다. 각 컴포넌트는 렌더링, 이벤트 처리, 데이터 바인딩 등의 기능을 수행합니다. 컴포넌트의 생명주기는 다음과 같이 이루어집니다.
- 초기화
- 매개변수 설정
- 렌더링 및 UI 업데이트
- 컴포넌트 소멸
컴포넌트의 생명주기를 제어하려면, 다양한 생명주기 메서드를 오버라이딩할 수 있습니다.
데이터 바인딩 및 이벤트 처리
데이터 바인딩은 컴포넌트의 프로퍼티와 UI 요소 사이의 데이터를 동기화하는 기능입니다. Blazor에서는 @bind
속성을 사용하여 데이터 바인딩을 설정할 수 있습니다.
<input type="text" @bind="UserName" />
위 예제에서 UserName
프로퍼티와 입력 상자의 값이 데이터 바인딩되어 동기화됩니다.
이벤트 처리는 사용자의 액션에 따라 발생하는 이벤트를 처리하는 기능입니다. Blazor에서는 @
기호와 이벤트 이름을 사용하여 이벤트 처리 메서드를 설정할 수 있습니다.
<button @onclick="SubmitForm">Submit</button>
위 예제에서 SubmitForm
메서드는 버튼 클릭 이벤트가 발생할 때 호출됩니다.
4. 라우팅 및 상태 관리
Blazor 라우팅 개념
Blazor 라우팅은 사용자가 요청한 URL에 따라 해당하는 컴포넌트를 표시하는 기능입니다. 라우팅 설정은 @page
지시문을 사용하여 컴포넌트에 지정할 수 있습니다.
@page "/counter"
위 예제에서 컴포넌트는 /counter
경로로 라우팅됩니다.
페이지 라우팅 및 매개변수 전달
페이지간 이동 시, 매개변수를 전달하려면 라우트 템플릿에 매개변수를 지정하고, 컴포넌트에 [Parameter]
속성을 사용하여 정의합니다.
@page "/product/{id}"
[Parameter]
public int Id { get; set; }
위 예제에서 id
매개변수를 통해 페이지에 전달된 값이 Id
프로퍼티에 저장됩니다.
네비게이션 매니저 활용
네비게이션 매니저를 사용하여 프로그래밍 방식으로 페이지간 이동을 수행할 수 있습니다. 이를 위해 NavigationManager
클래스를 사용합니다.
@inject NavigationManager NavigationManager
private void NavigateToProduct(int productId)
{
NavigationManager.NavigateTo($"/product/{productId}");
}
위 예제에서 NavigateToProduct
메서드는 주어진 productId
를 사용하여 상품 페이지로 이동합니다.
상태 관리 개념
상태 관리는 애플리케이션의 상태를 저장하고 변경하는 방법입니다. Blazor에서는 전역 상태와 컴포넌트 간 상태를 관리할 수 있습니다.
Cascading Parameters
캐스케이딩 매개변수를 사용하여 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달할 수 있습니다.
<CascadingValue Value="UserName">
<ChildComponent />
</CascadingValue>
[CascadingParameter]
public string UserName { get; set; }
위 예제에서 UserName
값을 하위 컴포넌트로 전달합니다.
Dependency Injection을 사용한 서비스 구현
의존성 주입을 사용하여 애플리케이션 전체에서 서비스를 공유하고 상태를 관리할 수 있습니다.
Blazor에서는 Startup.cs
파일의 ConfigureServices
메서드를 사용하여 의존성 주입을 설정합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IUserService, UserService>();
}
위 예제에서 IUserService
인터페이스와 해당 구현체인 UserService
를 등록하여 애플리케이션에서 사용할 수 있게 합니다.
5. 폼, 유효성 검사 및 데이터 처리
폼 구성
Blazor에서 폼을 구성하려면 EditForm
컴포넌트를 사용합니다.
<EditForm Model="Product" OnValidSubmit="HandleSubmit">
...
</EditForm>
데이터 양식 및 입력 유효성 검사
Blazor에서는 데이터 주석을 사용하여 입력 유효성 검사를 설정할 수 있습니다.
public class Product
{
[Required]
public string Name { get; set; }
[Range(1, 100)]
public int Quantity { get; set; }
}
또한 DataAnnotationsValidator
컴포넌트를 사용하여 폼의 유효성 검사를 활성화합니다.
<EditForm Model="Product" OnValidSubmit="HandleSubmit">
<DataAnnotationsValidator />
...
</EditForm>
서버 측 유효성 검사
서버 측 유효성 검사를 수행하려면, 서버에서 데이터를 검증한 후 클라이언트에 반환합니다. 반환된 결과를 사용하여 클라이언트 측에서 오류 메시지를 표시할 수 있습니다.
Blazor Server에서 CRUD 기능 구현하기
Blazor Server에서 CRUD(Create, Read, Update, Delete) 기능을 구현하려면, 서버 측에서 데이터 처리 로직을 작성한 후 클라이언트와 통신합니다.
예를 들어, 데이터를 생성하려면, 클라이언트에서 입력한 데이터를 서버로 전송하고 데이터베이스에 저장합니다. 데이터를 읽고, 업데이트하거나 삭제하는 작업도 동일한 방법으로 수행합니다.
Blazor Server에서 REST API 호출하기
Blazor Server에서 REST API를 호출하려면, HttpClient
를 사용하여 원격 서버와 통신합니다.
@inject HttpClient Http
private async Task LoadProducts()
{
var response = await Http.GetAsync("https://api.example.com/products");
var products = await response.Content.ReadAsAsync<IEnumerable<Product>>();
}
위 예제에서 LoadProducts
메서드는 원격 REST API에서 상품 목록을 가져옵니다.
Blazor Server에서 SignalR 사용하기
Blazor Server는 기본적으로 SignalR을 사용하여 서버와 클라이언트 간의 실시간 통신을 수행합니다. 이를 통해 데이터가 변경될 때마다 UI가 자동으로 업데이트됩니다. SignalR을 사용하여 사용자 정의 실시간 통신을 구현할 수도 있습니다.
- SignalR Hub를 구현합니다.
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
Startup.cs
파일에서 SignalR을 구성합니다.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
...
endpoints.MapHub<ChatHub>("/chathub");
});
}
- 클라이언트에서 SignalR 연결을 설정합니다.
@inject NavigationManager NavigationManager
@inject IJSRuntime JSRuntime
private HubConnection _hubConnection;
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/chathub"))
.Build();
_hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
{
// 메시지를 받았을 때 처리할 로직 작성
});
await _hubConnection.StartAsync();
}
- 클라이언트에서 메시지를 전송합니다.
private async Task SendMessage()
{
await _hubConnection.SendAsync("SendMessage", "User", "Hello, World!");
}
위 예제에서는 간단한 실시간 채팅 시스템을 구현합니다. 클라이언트가 SendMessage
메서드를 호출하면 서버의 ChatHub
에서 메시지를 받아 모든 클라이언트에게 전달합니다.
6. 스타일링 및 JavaScript 상호 작용
Blazor Server에서 CSS 파일 사용하기
Blazor Server 프로젝트에서 CSS 파일을 사용하려면, wwwroot
폴더 내부에 위치시키고 _Host.cshtml
파일에 다음과 같이 링크를 추가합니다.
<link href="css/custom.css" rel="stylesheet" />
Blazor Server에서 Bootstrap 사용하기
Blazor 프로젝트에서 Bootstrap을 사용하려면, _Host.cshtml
파일에 다음과 같이 링크를 추가합니다.
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" />
또한, index.html
파일에 Bootstrap의 JavaScript 및 jQuery 파일을 추가합니다.
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
Blazor Server에서 CSS Framework 사용하기
Blazor 프로젝트에서 다른 CSS 프레임워크를 사용하려면, 해당 프레임워크의 지침에 따라 스타일 시트 및 JavaScript 파일을 _Host.cshtml
파일에 추가합니다.
JavaScript Interop 소개
Blazor Server에서 JavaScript와 상호 작용하려면, JavaScript Interop 기능을 사용합니다. 이를 통해 JavaScript 함수를 호출하거나 .NET 메서드를 호출할 수 있습니다.
JavaScript 함수 호출하기
Blazor에서 JavaScript 함수를 호출하려면, IJSRuntime
인터페이스를 사용합니다.
@inject IJSRuntime JSRuntime
private async Task CallJavaScriptFunction()
{
await JSRuntime.InvokeVoidAsync("yourJavaScriptFunction", "parameter1", "parameter2");
}
위 예제에서 CallJavaScriptFunction
메서드는 yourJavaScriptFunction
이라는 JavaScript 함수를 호출하고 매개변수를 전달합니다.
.NET 메서드 호출하기
JavaScript에서 .NET 메서드를 호출하려면, DotNet
개체를 사용합니다.
- 먼저, C# 코드에서 메서드를 정의하고
[JSInvokable]
어트리뷰트를 추가합니다.
[JSInvokable]
public static Task<string> YourDotNetMethod(string parameter)
{
return Task.FromResult($"Hello, {parameter}!");
}
- JavaScript에서 다음과 같이 .NET 메서드를 호출합니다.
async function callDotNetMethod() {
const result = await DotNet.invokeMethodAsync('YourNamespace', 'YourDotNetMethod', 'World');
console.log(result);
- 필요한 경우, Blazor 컴포넌트의
OnAfterRenderAsync
메서드에서 JavaScript 함수를 호출하여 .NET 메서드를 실행합니다.
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await JSRuntime.InvokeVoidAsync("callDotNetMethod");
}
}
이 예제에서 JavaScript의 callDotNetMethod
함수는 C# 코드의 YourDotNetMethod
를 호출하고, 결과를 콘솔에 출력합니다. Blazor 컴포넌트가 렌더링된 후에 호출되도록 OnAfterRenderAsync
메서드를 사용합니다.
7. 데이터 액세스 및 Entity Framework Core
데이터 액세스 기초
데이터 액세스는 데이터베이스와 상호 작용하는 방법을 말합니다. 데이터를 생성, 읽기, 업데이트 및 삭제하는 CRUD 작업을 수행할 수 있습니다. Blazor Server에서는 Entity Framework Core를 사용하여 데이터 액세스를 처리합니다.
Entity Framework Core 소개
Entity Framework Core는 .NET Core에서 사용할 수 있는 데이터 액세스 기술입니다. 이를 사용하면 코드에서 데이터베이스와 상호 작용할 수 있으며, 데이터 모델과 데이터베이스를 매핑할 수 있습니다.
- 프로젝트에 Entity Framework Core를 설치합니다.
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design
- 데이터 모델 클래스를 생성합니다.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
- 데이터베이스 컨텍스트 클래스를 생성합니다.
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Product> Products { get; set; }
}
CRUD 작업 구현
- 데이터베이스 컨텍스트를 프로젝트에 등록합니다.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
appsettings.json
파일에 데이터베이스 연결 문자열을 추가합니다.
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BlazorApp;Trusted_Connection=True;MultipleActiveResultSets=true"
},
...
}
- Blazor 컴포넌트에서 데이터베이스와 상호 작용합니다.
- 생성
@inject ApplicationDbContext DbContext
private async Task AddProduct()
{
var product = new Product { Name = "Sample Product", Price = 9.99m };
DbContext.Products.Add(product);
await DbContext.SaveChangesAsync();
}
- 읽기
private List<Product> _products;
protected override async Task OnInitializedAsync()
{
_products = await DbContext.Products.ToListAsync();
}
- 업데이트
private async Task UpdateProduct(Product product)
{
product.Name = "Updated Product";
DbContext.Products.Update(product);
await DbContext.SaveChangesAsync();
}
- 삭제
private async Task DeleteProduct(Product product)
{
DbContext.Products.Remove(product);
await DbContext.SaveChangesAsync();
}
이 예제에서는 Blazor Server에서 Entity Framework Core를 사용하여 데이터 액세스를 처리하는 방법을 보여줍니다. 데이터베이스 컨텍스트를 사용하여 데이터를 생성, 읽기, 업데이트 및 삭제하는 CRUD 작업을 수행할 수 있습니다.
8. 인증 및 권한 관리
인증 및 권한 관리 소개
인증은 사용자의 신원을 확인하는 과정이며, 권한 관리는 사용자가 수행할 수 있는 작업을 제한하는 과정입니다. Blazor Server에서는 ASP.NET Core Identity를 사용하여 인증 및 권한 관리를 처리할 수 있습니다.
ASP.NET Core Identity 사용하기
- 프로젝트에 ASP.NET Core Identity를 설치합니다.
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
Startup.cs
파일에서ConfigureServices
메서드에서 Identity 서비스를 추가합니다.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
}
- 로그인 및 회원가입 페이지를 추가합니다.
@page "/signin"
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
...
### 권한 기반 인가
1. 정책 기반 권한 관리를 설정합니다.
```csharp
public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
}
- 컴포넌트에서 권한 기반 인가를 적용합니다.
@attribute [Authorize(Policy = "AdminOnly")]
9. 성능 최적화 및 보안
성능 최적화 전략
성능 최적화는 애플리케이션의 응답 시간을 줄이고, 리소스 사용을 최소화하는 과정입니다. Blazor Server에서는 lazy loading, 코드 분할 등의 기법을 사용하여 성능을 최적화할 수 있습니다.
Blazor Server에서 lazy loading 적용하기
Lazy loading은 애플리케이션 로딩 시 필요하지 않은 리소스를 로드하지 않고, 필요할 때 로드하는 기법입니다.
- Blazor 컴포넌트에서 필요한 리소스를 동적으로 로드합니다.
@inject HttpClient Http
@using System.Reflection
private async Task LoadAssembly()
{
var assemblyBytes = await Http.GetByteArrayAsync("path/to/assembly.dll");
var assembly = Assembly.Load(assemblyBytes);
}
Blazor Server에서 코드 분할하기
코드 분할은 애플리케이션의 여러 부분을 독립적인 덩어리로 분할하여, 필요한 부분만 로드하는 기법입니다.
Startup.cs
파일에서 Razor 컴파일러에 코드 분할을 적용하도록 설정합니다.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddRazorPages().AddRazorRuntimeCompilation(options =>
{
options.SplitOnNamespace = true;
});
}
보안 이슈 및 대응 방안
보안은 애플리케이션을 공격자로부터 보호하는 과정입니다. Blazor Server에서는 다양한 보안 기법을 사용하여 애플리케이션을 보호할 수 있습니다.
- 콘텐츠 보안 정책 (CSP)를 사용하여 악성 스크립트 공격을 방지합니다.
- 인증 및 권한 관리를 사용하여 사용자 액세스를 제한합니다.
- 입력 검증 및 서버 측 유효성 검사를 사용하여 데이터의 무결성을 유지합니다.
추가 리소스 및 라이브러리 소개
다음은 Blazor Server를 위한 추가 리소스 및 라이브러리를 소개합니다.
- Blazorise - 다양한 CSS 프레임워크를 지원하는 Blazor 컴포넌트 라이브러리
- DevExpress Blazor - 고품질의 Blazor UI 컴포넌트 라이브러리
- Radzen - Blazor 애플리케이션 개발을 위한 오픈 소스 툴킷
10. 배포 및 확장
배포 전략 이해
배포는 애플리케이션을 고객에게 제공하기 위해 서버에 올리는 과정입니다. 배포 전략을 통해 Blazor Server 애플리케이션을 클라우드 서비스에 배포할 수 있습니다.
Azure, AWS 등 클라우드 서비스를 이용한 배포
- 클라우드 서비스의 계정을 생성합니다.
- Blazor Server 애플리케이션을 클라우드 서비스에 배포합니다.
- 배포된 애플리케이션의 URL을 확인하여 정상 작동 여부를 검증합니다.
Blazor Server 프로젝트를 Azure 웹 앱에 게시하기 위한 Publish Profile 파일 사용
이 강의에서는 Azure 웹 앱에 Blazor Server 프로젝트를 게시하는 방법에 대해 설명합니다. Publish Profile 파일을 사용하여 프로젝트를 손쉽게 배포할 수 있습니다.
Visual Studio에서는 직접 도구 레벨에서 웹 앱에 게시하는 기능을 제공하지만, 박용준 강사의 강의에서는 게시 프로필을 사용하여 웹 앱을 먼저 만들고 Visual Studio에서 게시하는 순서를 사용합니다.
목차
- Azure 웹 앱 만들기
- Publish Profile 다운로드
- Visual Studio에서 Publish Profile 사용하기
- 프로젝트 게시 및 확인
1. Azure 웹 앱 만들기
먼저, Azure 웹 앱을 생성해야 합니다. 이를 위해 다음 단계를 수행하세요.
- Azure Portal에 로그인하십시오.
- 왼쪽 메뉴에서 "리소스 그룹"을 선택한 다음, 새 리소스 그룹을 생성하거나 기존 리소스 그룹을 선택하십시오.
- 리소스 그룹 페이지의 오른쪽 상단에 있는 "+추가" 버튼을 클릭하십시오.
- "웹 앱"을 검색하고 선택한 다음, "만들기"를 클릭하십시오.
- 기본 정보 탭에서 필요한 정보를 입력하고, "다음: 웹 호스팅"을 클릭하십시오.
- 웹 호스팅 탭에서 호스팅 계획 및 운영 체제를 선택한 후 "확인"을 클릭하십시오.
- 최종 검토 및 생성 페이지에서 모든 설정을 확인한 후, "만들기"를 클릭하여 웹 앱을 생성하십시오.
2. Publish Profile 다운로드
웹 앱이 생성되면 Publish Profile을 다운로드해야 합니다.
- Azure Portal에서 생성한 웹 앱으로 이동하십시오.
- 개요 페이지의 오른쪽 상단에 있는 "게시 프로필 가져오기"를 클릭하여 Publish Profile 파일을 다운로드하십시오.
3. Visual Studio에서 Publish Profile 사용하기
이제 Visual Studio에서 Publish Profile을 사용하여 Blazor Server 프로젝트를 게시할 준비가 되었습니다.
- Visual Studio에서 Blazor Server 프로젝트를 연 다음, 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
- "게시"를 선택하여 게시 대화상자를 엽니다.
- "시작"을 클릭한 다음, "게시 프로필 가져오기"를 선택하십시오.
- 이전 단계에서 다운로드한 Publish Profile 파일을 찾아 선택하십시오.
4. 프로젝트 게시 및 확인
Visual Studio에서 프로젝트를 게시합니다.
- 게시 대화상자에서 "게시" 버튼을 클릭하여 프로젝트를 Azure 웹 앱에 게시하십시오.
- 프로젝트가 성공적으로 게시된 후, 웹 브라우저에서 Azure 웹 앱 URL로 이동하여 게시된 Blazor Server 프로젝트를 확인하십시오.
이제 Azure 웹 앱에 Blazor Server 프로젝트를 성공적으로 게시하였습니다. 이를 통해 사용자들이 웹 애플리케이션에 원활하게 액세스할 수 있게 되었습니다.
WebSockets 활성화
Blazor Server 프로젝트를 실행하는 웹 앱은 반드시 WebSockets 기능을 활성화해야 합니다.
설정 절차는 다음과 같습니다.
- Azure Portal에서 생성한 웹 앱으로 이동하십시오.
- 왼쪽 메뉴에서 "구성"을 선택하십시오.
- "일반 설정" 탭으로 이동한 다음, "WebSockets" 설정을 찾아 "활성화"로 설정하십시오.
- 변경 사항을 저장하기 위해 상단에 있는 "저장" 버튼을 클릭하십시오.
GitHub Actions를 이용한 CI/CD 파이프라인 구성
- GitHub 리포지토리에
.github/workflows
폴더를 생성합니다. main.yml
파일을 생성하고 GitHub Actions 워크플로우를 구성합니다.git push
명령을 사용하여 변경 사항을 리포지토리에 푸시합니다.- GitHub Actions가 애플리케이션을 빌드하고 배포하는 것을 확인합니다.
Blazor Server에서 Custom 컴포넌트 만들기
- 새로운 Razor 컴포넌트를 생성합니다.
- 컴포넌트에 필요한 로직과 UI를 구현합니다.
- 다른 Blazor 컴포넌트에서 사용하기 위해 컴포넌트를 레퍼런스합니다.
Blazor Server에서 Blazor WebAssembly 사용하기
- Blazor WebAssembly 프로젝트를 생성합니다.
- Blazor Server 애플리케이션에 Blazor WebAssembly 프로젝트를 추가합니다.
- 서버와 클라이언트 간에 공유하는 코드를 별도의 클래스 라이브러리로 분리합니다.
Blazor Server에서 Blazor Hybrid 앱 개발하기
- Blazor Server 애플리케이션을 모바일 및 데스크톱 애플리케이션으로 변환합니다.
- 네이티브 플랫폼에 특화된 기능을 추가합니다.
- 애플리케이션을 모바일 및 데스크톱 애플리케이션 스토어에 게시합니다.
11. 실전 프로젝트
실전 프로젝트 개요 및 목표 설정
실전 프로젝트에서는 앞서 배운 내용을 종합하여 실제로 작동하는 Blazor Server 애플리케이션을 개발합니다. 프로젝트의 목표와 요구 사항을 설정하고, 개발 과정을 계획합니다.
프로젝트 구현 과정
- 프로젝트의 기본 구조를 생성합니다.
- 데이터 모델과 데이터 액세스를 구현합니다.
- UI 컴포넌트와 페이지를 개발합니다.
- 인증 및 권한 관리를 구현합니다.
- 성능 최적화 및 보안을 적용합니다.
- 애플리케이션을 테스트하고 문제를 수정합니다.
프로젝트 완성 및 리뷰
프로젝트가 완성되면, 전체 애플리케이션을 검토하고 개선 사항을 적용합니다. 이를 통해 높은 품질의 Blazor Server 애플리케이션을 개발하게 됩니다.
버튼 클릭시 모달 폼 띄우기
Blazor는 C#과 HTML, CSS를 사용하여 웹 애플리케이션을 개발할 수 있는 Microsoft의 프레임워크입니다. Blazor에서는 Razor 구문과 C# 코드를 함께 사용하여 UI와 로직을 작성할 수 있습니다.
이번 강좌에서는 Blazor를 사용하여 버튼 클릭 시 모달 폼을 띄우는 예제를 작성해 보겠습니다. 모달 폼은 ModalForm.razor 컴포넌트를 사용하여 구현하고, 버튼은 ButtonWithModal.razor 컴포넌트를 사용하여 구현할 것입니다.
1. 새 Blazor 프로젝트 생성하기
먼저 Visual Studio를 열고 새 Blazor 프로젝트를 생성합니다.
- Create a new project을 클릭합니다.
- 검색창에 "Blazor"를 입력하고 "Blazor App"을 선택합니다.
- 이름을 "BlazorModalExample"으로 지정하고, Create를 클릭합니다.
- Blazor Server App 템플릿을 선택하고, Create를 클릭합니다.
2. ModalForm 컴포넌트 작성하기
먼저, ModalForm.razor 파일을 생성하고 다음 코드를 작성합니다.
<!-- ModalForm.razor -->
<div class="modal" tabindex="-1" role="dialog" style="display: @(ShowModal ? "block" : "none")">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">@Title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" @onclick="CloseModal">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
@ChildContent
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" @onclick="CloseModal">Close</button>
</div>
</div>
</div>
</div>
@code {
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public string Title { get; set; }
[Parameter]
public bool ShowModal { get; set; }
[Parameter]
public EventCallback<bool> ShowModalChanged { get; set; }
private async Task CloseModal()
{
ShowModal = false;
await ShowModalChanged.InvokeAsync(false);
}
}
위 코드에서는 Bootstrap 4를 사용하여 모달 폼을 구현했습니다. ModalForm 컴포넌트는 다음과 같은 파라미터를 가집니다.
- ChildContent: 모달 폼 내부에 표시될 컨텐츠를 포함하는 RenderFragment입니다.
- Title: 모달 폼의 제목입니다.
- ShowModal: 모달 폼을 표시할지 여부를 나타내는 bool 값입니다.
- ShowModalChanged: ShowModal 값이 변경될 때 호출되는 이벤트입니다.
CloseModal 메서드는 모달 폼을 닫을 때 호출됩니다. ShowModal 값을 false로 설정하고, ShowModalChanged 이벤트를 발생시켜 ButtonWithModal 컴포넌트에서 ShowModal 값을 업데이트할 수 있도록 합니다.
3. ButtonWithModal 컴포넌트 작성하기
이제 ButtonWithModal.razor 파일을 생성하고 다음 코드를 작성합니다.
<!-- ButtonWithModal.razor -->
<button class="btn btn-primary" @onclick="() => ShowModal = true">Open Modal</button>
<ModalForm Title="My Modal" ShowModal="@ShowModal" ShowModalChanged="(value) => ShowModal = value">
<p>This is the content of the modal.</p>
</ModalForm>
@code {
private bool ShowModal = false;
}
위 코드에서는 Bootstrap 4의 버튼 스타일을 사용하여 버튼을 구현했습니다. 버튼을 클릭하면 ShowModal 값을 true로 설정하여 모달 폼을 표시합니다. ModalForm 컴포넌트를 사용하여 모달 폼을 구현하고, ShowModal 값을 전달하여 모달 폼의 표시 여부를 제어합니다.
ModalForm 컴포넌트는 Title과 ShowModal, ShowModalChanged 파라미터를 받아와 모달 폼을 표시하고 제어합니다. ChildContent 파라미터에는 모달 폼 내부에 표시될 컨텐츠를 작성합니다. 이 예제에서는 간단한 문장을 사용하여 모달 폼 내용을 표시했습니다.
4. ButtonWithModal 컴포넌트 사용하기
이제 ButtonWithModal 컴포넌트를 사용하는 페이지에서 ButtonWithModal 컴포넌트를 출력합니다. 이 예제에서는 Index.razor 페이지에서 ButtonWithModal 컴포넌트를 출력합니다.
<!-- Index.razor -->
@page "/"
<h1>Hello, Blazor!</h1>
<ButtonWithModal />
위 코드에서는 ButtonWithModal 컴포넌트를 Index.razor 페이지에서 사용합니다. 이제 브라우저에서 http://localhost:5000으로 접속하여 버튼을 클릭해 보면 모달 폼이 표시되는 것을 확인할 수 있습니다.
5. 세로 스크롤바 추가하기
만약 모달 폼의 내용이 세로 길이가 200px 이상이 되면 세로 스크롤바를 추가하고 싶다면, ModalForm.razor 파일에서 모달 내부에 스크롤 가능한 div 요소를 추가하면 됩니다. 다음과 같이 코드를 수정해주세요.
<!-- ModalForm.razor -->
<div class="modal" tabindex="-1" role="dialog" style="display: @(ShowModal ? "block" : "none")">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">@Title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" @onclick="CloseModal">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="max-height: 200px; overflow-y: auto;">
@ChildContent
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" @onclick="CloseModal">Close</button>
</div>
</div>
</div>
</div>
위 코드에서는 max-height 속성을 사용하여 모달 내부의 최대 높이를 200px로 제한하고, overflow-y 속성을 사용하여 세로 스크롤바를 추가합니다.
이제 브라우저에서 http://localhost:5000으로 접속하여 버튼을 클릭하고 모달 폼이 표시되면, 모달 내용이 200px 이상일 때 세로 스크롤바가 표시되는 것을 확인할 수 있습니다.