안녕하세요😊 오늘은 .NET Core에서 컨트롤러의 동작을 조정하고 재사용 가능한 로직을 구현할 때 유용한 ActionFilterAttribute에 대해 알아보겠습니다.
🎈 ActionFilterAttribute란?
ActionFilterAttribute는 .NET Core에서 제공하는 액션 필터(Action Filter) 기능을 구현할 수 있는 속성(attribute)입니다. 컨트롤러나 액션 메서드에 적용하여 액션 실행 전후에 원하는 동작을 수행할 수 있습니다.
📌 주요 사용 예시:
- 요청(Request) 전/후 로깅 📝
- 실행 시간 측정 ⏱
- 인증 및 권한 검사 🔐
- 입력값 검증 🧐
ActionFilterAttribute를 활용하면 중복되는 로직을 필터로 빼서 코드의 재사용성과 유지보수성을 높일 수 있습니다!
⚙️ ActionFilterAttribute의 작동 방식
ActionFilterAttribute는 컨트롤러와 액션의 실행 흐름을 가로채서 특정 로직을 수행할 수 있도록 해줍니다. 이를 위해 다음 두 가지 주요 메서드를 오버라이딩하여 동작합니다.
🛠️ 주요 메서드
1️⃣ OnActionExecuting(ActionExecutingContext context)
- 액션 메서드 실행 전에 호출됩니다.
- 요청 정보를 검증하거나, 필요한 사전 작업을 수행할 수 있습니다.
- 예를 들어, 로그인 세션이 없으면 요청을 차단하고 로그인 페이지로 리디렉트할 수 있습니다.
2️⃣ OnActionExecuted(ActionExecutedContext context)
- 액션 메서드 실행 후에 호출됩니다.
- 실행된 결과를 변경하거나, 후처리 작업을 수행할 수 있습니다.
- 예를 들어, API 요청의 실행 시간을 로깅하거나, 특정 조건에서 추가적인 응답 데이터를 설정할 수 있습니다.
📌 일상적인 비유
이 개념을 일상생활에 비유하면 레스토랑에서의 주문 과정과 비슷합니다. 🍽️
- OnActionExecuting: 주문을 받기 전에 직원이 고객의 예약 여부를 확인하는 단계
- 컨트롤러 액션 실행: 주문한 음식을 요리하는 과정
- OnActionExecuted: 음식이 나온 후 고객의 만족도를 확인하고 추가 요청을 받는 과정
이처럼 액션 실행 전후에 필요한 검증이나 후처리를 수행할 수 있는 것이 ActionFilterAttribute의 핵심 기능입니다.
🔑 로그인 세션 확인 필터 구현하기
예제로 로그인 세션을 확인하는 커스텀 액션 필터를 만들어 보겠습니다.
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Http;
public class LoginSessionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var session = context.HttpContext.Session;
if (session.GetString("UserId") == null)
{
// 로그인 세션이 없으면 로그인 페이지로 리디렉션
context.Result = new RedirectToActionResult("Login", "Account", null);
}
}
}
📌 필터 적용하기
위에서 만든 LoginSessionFilter를 컨트롤러나 액션 메서드에 적용하면, 로그인 세션이 없는 경우 자동으로 로그인 페이지로 이동하도록 할 수 있습니다.
[LoginSessionFilter]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
이제 HomeController의 Index 액션을 호출할 때 로그인 세션이 없으면 로그인 페이지로 리디렉트됩니다! ✅
🎯 간단한 로깅 필터 예제
다음은 액션 실행 전후로 로깅하는 필터 예제입니다.
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
public class LoggingFilter : ActionFilterAttribute
{
private readonly ILogger<LoggingFilter> _logger;
public LoggingFilter(ILogger<LoggingFilter> logger)
{
_logger = logger;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogInformation("액션 실행 전: {ActionName}", context.ActionDescriptor.DisplayName);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
_logger.LogInformation("액션 실행 후: {ActionName}", context.ActionDescriptor.DisplayName);
}
}
컨트롤러에 적용하면 로그에 액션 실행 전후의 정보가 남게 됩니다. 👀
[LoggingFilter]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
🎯 ActionFilterAttribute vs Middleware 차이점
Action FilterMiddleware
컨트롤러와 액션에 초점 | 전체 HTTP 요청 파이프라인에 초점 |
특정 컨트롤러/액션에 적용 | 모든 요청에 대해 실행 가능 |
MVC 전용 기능 | MVC뿐만 아니라 API, Static Files 등 모든 요청 처리 가능 |
필터는 특정 컨트롤러나 액션에만 적용할 수 있어 세밀한 제어가 가능하고, 미들웨어는 전역적으로 동작하여 모든 요청을 처리할 수 있습니다. 상황에 맞게 적절한 방법을 선택하면 됩니다! 😊
📌 정리 및 마무리
오늘은 .NET Core에서 ActionFilterAttribute를 활용하여 액션 실행 전후에 특정 로직을 추가하는 방법을 알아보았습니다.
💡 핵심 정리: ✅ OnActionExecuting, OnActionExecuted를 활용하여 사전/사후 처리 가능 ✅ 로그인 세션 검증, 로깅 등 다양한 활용 가능 ✅ 미들웨어와 비교하여 컨트롤러/액션 단위로 적용 가능 ✅ 일상 속 레스토랑 주문 과정과 비슷한 흐름을 가짐
ActionFilterAttribute를 활용하면 더 깔끔하고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 🚀
앞으로도 유용한 .NET Core 관련 글을 계속 공유하겠습니다. 감사합니다! 😊
참고
ActionFilterAttribute 클래스 (System.Web.Mvc) | Microsoft Learn
'Language > C#' 카테고리의 다른 글
[C#] System.Threading.Channels 구현하기 (0) | 2025.03.19 |
---|---|
[C#] .NET에서 Dependency Injection(DI) 기초 가이드 (0) | 2025.02.26 |
[C#] C# 클로저(Closure) 쉽게 이해하기 (0) | 2025.02.07 |
[C#] DotNetty로 TCP 소켓 통신 구현: Unity와 게임 서버 간 패킷 교환하기 (0) | 2025.01.03 |
[C#] protobuf-net 프로토콜 (0) | 2025.01.02 |