나만의 ASP.NET 프레임워크 시작 바로가기
📦 HyochulLab.Core
✅ 주요 구성
파일 설명
| IResult.cs | 성공/실패 구조 인터페이스 |
| Result.cs | 성공/실패 응답 모델 |
| DataResult<T>.cs | 데이터 포함 응답 모델 |
| AppConstants.cs | 공통 메시지, 상수 관리 |
| StringExtensions.cs | 문자열 유틸리티 확장 |
예시: Result.cs
namespace HyochulLab.Core.Results;
public class Result : IResult
{
public bool IsSuccess { get; protected set; }
public string Message { get; protected set; }
public static Result Success(string message = "성공") =>
new Result { IsSuccess = true, Message = message };
public static Result Fail(string message = "실패") =>
new Result { IsSuccess = false, Message = message };
}
🌐 HyochulLab.Web
✅ 핵심 구성
파일 설명
| ExceptionHandlingMiddleware.cs | 글로벌 예외 처리 미들웨어 |
| ModelValidationFilter.cs | 모델 유효성 검증 필터 |
| ApplicationBuilderExtensions.cs | 미들웨어 등록용 확장 메서드 |
ExceptionHandlingMiddleware.cs
using System.Net;
using System.Text.Json;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using HyochulLab.Core.Results;
namespace HyochulLab.Web.Middleware;
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<ExceptionHandlingMiddleware> _logger;
public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
_logger.LogError(ex, "Unhandled Exception");
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.Response.ContentType = "application/json";
var error = Result.Fail("서버 오류가 발생했습니다.");
var json = JsonSerializer.Serialize(error);
await context.Response.WriteAsync(json);
}
}
}
확장 메서드 등록
namespace HyochulLab.Web.Extensions;
public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseHyochulLabExceptionHandling(this IApplicationBuilder app)
{
return app.UseMiddleware<HyochulLab.Web.Middleware.ExceptionHandlingMiddleware>();
}
}
🚀 HyochulLab.SampleApp (웹앱)
✅ 구조
Controllers/
└── HelloController.cs
Models/
└── HelloRequest.cs
Program.cs
HelloRequest.cs
using System.ComponentModel.DataAnnotations;
namespace HyochulLab.SampleApp.Models;
public class HelloRequest
{
[Required]
public string Name { get; set; } = string.Empty;
}
HelloController.cs
using Microsoft.AspNetCore.Mvc;
using HyochulLab.Core.Results;
using HyochulLab.SampleApp.Models;
namespace HyochulLab.SampleApp.Controllers;
[ApiController]
[Route("api/[controller]")]
public class HelloController : ControllerBase
{
[HttpPost]
public IActionResult SayHello([FromBody] HelloRequest request)
{
var message = $"안녕하세요, {request.Name}님!";
return Ok(DataResult<string>.Success(message));
}
}
Program.cs
using HyochulLab.Web.Extensions;
using HyochulLab.Web.Filters;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.Filters.Add<ModelValidationFilter>();
});
var app = builder.Build();
app.UseHyochulLabExceptionHandling();
app.MapControllers();
app.MapGet("/", () => "HyochulLab 웹앱 정상 작동 중 ✅");
app.Run();
✅ 실행 시 확인 URL
주소 설명
| GET / | 루트 테스트용 메시지 |
| POST /api/hello | Hello API 테스트 |
테스트 예시
Request:
POST /api/hello
Content-Type: application/json
{
"name": "효철"
}
Response:
{
"isSuccess": true,
"message": "성공",
"data": "안녕하세요, 효철님!"
}
⚙️ NuGet 패키지 정리
Core, Web, SampleApp 공통
- Microsoft.AspNetCore.App → 직접 설치 ❌ (SDK에 포함)
- Microsoft.Extensions.Logging → 기본 포함
- System.Text.Json → 기본 포함
- 👉 추가 설치 필요 없음
다음 단계
모듈 설명
| ✅ Data | DbContext, Repository, UnitOfWork |
| 🔜 Logging | Serilog 등 외부 로그 시스템 연동 |
| 🔜 DI | 서비스 등록 자동화 (AddHyochulLabFramework() 등) |
| 🔜 Test | xUnit 기반 테스트 프로젝트 |
.png)
댓글
댓글 쓰기