SPMS_API/SPMS.API/Program.cs
SEAN 3125726e2c
All checks were successful
SPMS_API/pipeline/head This commit looks good
fix: Development 환경에서 UseHttpsRedirection 비활성화 (#24)
2026-02-09 15:33:56 +09:00

94 lines
2.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using Serilog;
using SPMS.API.Extensions;
using SPMS.API.Middlewares;
using SPMS.Application.Interfaces;
using SPMS.Domain.Interfaces;
using SPMS.Infrastructure;
using SPMS.Infrastructure.Auth;
using SPMS.Infrastructure.Persistence;
using SPMS.Infrastructure.Persistence.Repositories;
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
WebRootPath = Environment.GetEnvironmentVariable("ASPNETCORE_WEBROOT")
?? "wwwroot"
});
// ===== 1. Serilog =====
builder.Host.UseSerilog((context, config) =>
config.ReadFrom.Configuration(context.Configuration));
builder.Services.AddControllers();
builder.Services.AddOpenApi();
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)));
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<IJwtService, JwtService>();
// JWT 인증/인가
builder.Services.AddJwtAuthentication(builder.Configuration);
builder.Services.AddAuthorizationPolicies();
var app = builder.Build();
// ── 1. 예외 처리 (최외곽 — 이후 모든 미들웨어 예외 포착) ──
app.UseMiddleware<ExceptionMiddleware>();
// ── 3. X-Request-ID 발급/반환 (클라이언트 디버깅용) ──
app.UseMiddleware<RequestIdMiddleware>();
// ── 4. Serilog 구조적 로깅 (X-Request-ID 이후에 위치) ──
app.UseSerilogRequestLogging(options =>
{
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
if (httpContext.Items.TryGetValue("RequestId", out var requestId))
{
diagnosticContext.Set("RequestId", requestId);
}
};
});
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
var webRoot = app.Environment.WebRootPath;
Console.WriteLine($"[System] Web Root Path: {webRoot}");
if (Directory.Exists(webRoot))
{
app.UseStaticFiles();
}
else
{
Console.WriteLine("[Error] Web root folder not found!");
}
// ── 5. HTTPS 리다이렉션 (Nginx가 HTTPS 처리하므로 Production에서만) ──
if (!app.Environment.IsDevelopment())
{
app.UseHttpsRedirection();
}
app.UseRouting();
// ── 10. JWT 인증 ──
app.UseAuthentication();
// ── 11. 역할 인가 ──
app.UseAuthorization();
// [엔드포인트 매핑]
app.MapControllers();
app.MapFallbackToFile("index.html");
app.Run();