ASP.NET MVC 애플리케이션에서 필터(Filter)는 요청 처리 파이프라인 전반에 걸쳐 인증, 예외 처리 등의 공통 로직을 재사용할 수 있게 해주는 강력한 기능입니다. 필터는 다음과 같이 세 가지 수준에서 적용할 수 있습니다.
- 액션 메서드(Action Method) 수준
- 컨트롤러(Controller) 수준
- 전역(Global) 수준
1. 액션 메서드 수준
액션 메서드 수준에 적용된 필터는 해당 액션 메서드에만 영향을 미칩니다. 특정 작업에만 인증이나 로깅 같은 처리가 필요할 때 유용합니다.
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers
{
public class HomeController : Controller
{
[Authorize] // 액션 메서드 수준
public string Index()
{
return "Index Invoked";
}
}
}위 예제에서 [Authorize] 속성은 Index 액션 메서드에만 적용되며, 컨트롤러 내 다른 액션 메서드에는 영향을 주지 않습니다.
2. 컨트롤러 수준
컨트롤러 클래스에 필터를 선언하면 해당 컨트롤러의 모든 액션 메서드에 일괄 적용됩니다. 아래 예제의 필터는 HomeController의 모든 액션 메서드에 적용되지만, 다른 컨트롤러에는 적용되지 않습니다.
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers
{
[Authorize] // 컨트롤러 수준
public class HomeController : Controller
{
public string Index1()
{
return "Index1 Invoked";
}
public string Index2()
{
return "Index2 Invoked";
}
}
}이 방식은 하나의 컨트롤러가 담당하는 기능 전체에 동일한 규칙(예: 로그인 필요 여부)을 적용하고 싶을 때 효과적입니다.
3. 전역(Global) 수준
전역 필터는 global.asax.cs 파일의 Application_Start 이벤트에서 FilterConfig.RegisterGlobalFilters() 메서드를 통해 등록합니다. 이렇게 등록된 필터는 애플리케이션의 모든 컨트롤러와 액션 메서드에 적용됩니다.
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
}위 예제에서는 오류 처리(HandleErrorAttribute)와 인증(AuthorizeAttribute) 필터를 전역으로 등록하여, 애플리케이션 전체에서 일관된 동작을 보장합니다.
정리
| 적용 수준 | 적용 범위 | 등록 위치 |
|---|---|---|
| 액션 메서드 수준 | 특정 액션 메서드만 | 액션 메서드 위의 속성(Attribute) |
| 컨트롤러 수준 | 해당 컨트롤러의 모든 액션 메서드 | 컨트롤러 클래스 위의 속성 |
| 전역 수준 | 애플리케이션 전체 | global.asax.cs의 Application_Start |
필터 적용 범위가 넓어질수록 관리가 편해지지만, 의도치 않은 동작이 발생할 수 있으므로 필요한 범위에 맞게 적절한 수준을 선택하는 것이 중요합니다.