.NET 6의 Program.cs와 .NET 5의 Startup.cs 비교
.NET 6의 Program.cs와 .NET 5의 Startup.cs 파일을 비교합니다.
.NET 6, 7, 8 이후로는
기존 .NET 버전에서의 Startup.cs 파일이 생성되지 않습니다.
대신에 Program.cs 파일에 Startup.cs 파일의 기능을 적용합니다.
예제 코드는 다음 경로에 있습니다.
https://github.com/VisualAcademy/DotNetSix
ASP.NET Core Web Application을 생성하는 예시입니다.
프로젝트 생성 과정에서 .NET 6.0과 계별 계정을 선택하는 모양입니다.
.NET 5 SDK가 설치되어 있는 상태에서 ASP.NET Core Razor Pages 프로젝트 생성하는 모양입니다.
마지막으로 .NET 6를 사용하되, Top-Level Statements를 사용하지 않고 Main 메서드를 사용하는 모양입니다.
.NET 6에서 Top-Level Statement를 사용하여 프로젝트를 생성하면 Program.cs 파일 하나만 만들어지고, 주석을 제외한 코드는 다음과 같습니다.
이 코드에 의존성 주입 관련된 코드 및 기타 코드들이 들어옵니다.
<코드> .NET 6의 Program.cs 파일 기본 코드
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplication6.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
</코드>
.NET 1.0부터 .NET 5까지의 프로젝트 템플릿은 Program.cs와 Startup.cs 파일로 분리되어 프로젝트가 생성됩니다.
<코드> .NET 5의 Startup.cs 파일 기본 코드
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using WebApplication5.Data;
namespace WebApplication5
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
</코드>
.NET 6에서 Top-Level Statements를 사용하지 않고 Main 메서드를 포함하여 생성된 Program.cs 파일의 모양입니다.
<코드>.NET 6의 Program.cs 파일에 Main 메서드 사용
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplicationWithMain.Data;
namespace WebApplicationWithMain
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
}
}
}
</코드>
.NET 6가 아닌 .NET 5와 같이 이전 버전의 소스와 강좌 그리고 책의 내용을 참고할 때에는 다음 2가지 사항을 주의하면 됩니다.
다음 코드의 [1]번 주석과 [2]번 주석을 참고하세요.
<코드>
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplicationWithMain.Data;
namespace WebApplicationWithMain
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
//[1] Startup.cs 파일의 ConfigureServices 메서드의 코드는 이곳에 작성
// services.AddXXX() 형태는 builder.Services.AddXXX() 형태로 변경해서 작성
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
//[2] Startup.cs 파일의 Configure 메서드의 코드는 이곳에 작성
// app.UseXXX() 형태의 코드를 그대로 사용 가능
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
}
}
}
</코드>
감사합니다.
Comments
Comments are closed