안녕하세요😊 오늘은 .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();
    }
}

이제 HomeControllerIndex 액션을 호출할 때 로그인 세션이 없으면 로그인 페이지로 리디렉트됩니다!


🎯 간단한 로깅 필터 예제

다음은 액션 실행 전후로 로깅하는 필터 예제입니다.

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

+ Recent posts