전체 글
-
[C#] DateTime vs DateTimeOffset, 서버 시간은 UTC로 관리하기Microsoft .NET/C# 2026. 11. 10. 01:04
서버에서 시간을 다루다 보면 9시간 차이(UTC/KST)로 하루가 밀리는 문제를 만납니다. 저장·전송은 UTC로, 표시만 현지 시간으로 하는 규칙입니다.절차DateTime의 두 가지 KindDateTimeOffset저장 규칙표시 규칙 1. DateTime의 Kindvar local = DateTime.Now; // Kind = Local (서버 시간대 따름)var utc = DateTime.UtcNow; // Kind = Utcvar none = new DateTime(2026,1,1); // Kind = UnspecifiedDateTime.Now는 서버 시간대를 따릅니다. 한국 서버에서 개발하고 미국 서버에 배포하면 14시간 차이가 납니다.2. Dat..
-
[Linux] systemd로 .NET 앱 서비스 등록, 자동 재시작까지Linux 2026. 11. 10. 01:02
Linux 서버에서 .NET 앱을 상시 서비스로 등록하는 systemd 단위 파일 구성입니다.절차게시단위 파일 작성서비스 등록로그 확인 1. 게시dotnet publish -c Release -o /var/www/myapp2. 단위 파일 작성# /etc/systemd/system/myapp.service[Unit]Description=MyApp ASP.NET Core ServiceAfter=network.target[Service]WorkingDirectory=/var/www/myappExecStart=/usr/bin/dotnet /var/www/myapp/MyApp.dllRestart=alwaysRestartSec=10KillSignal=SIGINTUser=www-dataEnvironment=ASPNE..
-
[ASP.NET Core] Swagger UI에 JWT 인증(Authorize) 추가하기Microsoft .NET/ASP.Net & ASP.Net Core 2026. 11. 10. 00:58
Swagger UI에서 Authorize 버튼으로 Bearer 토큰을 넣어 테스트하는 설정입니다.절차패키지 설치보안 스키마 등록UI에서 토큰 입력자주 하는 실수 1. 패키지dotnet add package Swashbuckle.AspNetCore2. 보안 스키마 등록builder.Services.AddSwaggerGen(o =>{ o.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = Paramet..
-
[C#] async/await 데드락 원인과 ConfigureAwait 정리Microsoft .NET/C# 2026. 11. 10. 00:55
UI 앱이나 레거시 코드에서 .Result·.Wait()를 쓰다가 화면이 멈추는 데드락, 그리고 ConfigureAwait(false)가 필요한 이유입니다.절차증상원인: 동기 대기와 컨텍스트해결: async all the way라이브러리에서는 ConfigureAwait(false) 1. 증상// WinForms/WPF 버튼 클릭 핸들러var data = GetDataAsync().Result; // 여기서 멈춤(응답 없음)예외도 없이 그대로 멈춥니다. 디버거로 보면 WaitForSingleObject에서 대기 중입니다.2. 원인await는 기본적으로 원래 SynchronizationContext(UI 스레드)로 돌아오려고 합니다. 그런데 UI 스레드는 .Result에서 이미 블로킹 중이라 돌아갈 곳이..
-
[ASP.NET Core] CORS 오류 "blocked by CORS policy" 원인과 설정Microsoft .NET/ASP.Net & ASP.Net Core 2026. 11. 10. 00:53
브라우저에서 프론트엔드와 API를 따로 띄우면 만나는 blocked by CORS policy 오류의 원인과 최소 설정입니다.절차에러 메시지 확인서버 설정미들웨어 위치자주 하는 실수 1. 에러 메시지Access to fetch at 'http://localhost:5000/api/values' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.CORS는 브라우저가 막는 것이지 서버가 요청을 거부한 것이 아닙니다. 서버 로그에는 200으로 찍히는데 화면에서만 실패하는 이유입니다.2. 서버 설정bui..
-
[C#] HttpClient 재시도, IHttpClientFactory와 표준 리질리언스 정책Microsoft .NET/C# 2026. 11. 10. 00:50
외부 API 호출이 가끔 실패할 때 재시도는 필수입니다. .NET 8에서는 Microsoft.Extensions.Http.Resilience로 표준화된 정책을 붙일 수 있습니다.절차패키지 설치IHttpClientFactory 등록정책 세부 조정직접 구현하는 경우 1. 패키지dotnet add package Microsoft.Extensions.Http.Resilience2. 기본 등록builder.Services.AddHttpClient("api", c =>{ c.BaseAddress = new Uri("https://api.example.com"); c.Timeout = TimeSpan.FromSeconds(10);}).AddStandardResilienceHandler();AddStanda..
-
[ASP.NET Core] 전역 예외 처리, IExceptionHandler와 ProblemDetails (.NET 8)Microsoft .NET/ASP.Net & ASP.Net Core 2026. 11. 10. 00:47
.NET 8에서 추가된 IExceptionHandler로 예외 응답을 한 곳에서 처리하는 방법입니다. 컨트롤러마다 try-catch를 넣지 않아도 됩니다.절차핸들러 작성등록응답 형식 확인주의할 점 1. 핸들러 작성public class GlobalExceptionHandler : IExceptionHandler{ private readonly ILogger _logger; public GlobalExceptionHandler(ILogger logger) => _logger = logger; public async ValueTask TryHandleAsync(HttpContext ctx, Exception ex, CancellationToken ct) { _logger.L..
-
[.NET] BackgroundService로 주기 작업 만들기, 종료 처리까지Microsoft .NET/ASP.Net & ASP.Net Core 2026. 11. 10. 00:45
ASP.NET Core에서 주기적으로 도는 작업(정리, 동기화, 알림)을 만드는 가장 단순한 방법인 BackgroundService 정리입니다.절차최소 구현DI 주입 주의정상 종료 처리운영에서 확인할 것 1. 최소 구현public class CleanupWorker : BackgroundService{ private readonly ILogger _logger; public CleanupWorker(ILogger logger) => _logger = logger; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationReq..