ASP.NET MVC에서 사용자 지정 작업 필터를 만드는 방법
ASP.NET MVC에서 필터는 다양한 수준의 요청 처리에 로직을 주입하고 컨트롤러 간에 로직을 공유할 수 있도록 하는 데 사용됩니다. 더 알아보세요.
ASP.NET MVC에서 필터는 다양한 수준의 요청 처리에 로직을 주입하고 컨트롤러 간에 로직을 공유할 수 있도록 하는 데 사용됩니다. 예를 들어, 컨트롤러에서 보안 로직 또는 로깅 로직을 실행하려고 한다고 가정해 보겠습니다. 이를 위해 해당 logics를 포함하는 필터를 작성하고 모든 컨트롤러에서 활성화합니다. 모든 컨트롤러 또는 작업에서 필터를 활성화하면 필터가 예정된 HTTP 요청을 활성화합니다.
로깅(Logging)의 시나리오를 생각해 봅시다: 들어오는 모든 요청에 대해, 우리는 몇 가지 논리를 기반으로 파일에 일부 데이터를 기록해야 합니다. 사용자 지정 필터 내에서 이 로직을 생성하지 않으면 각 컨트롤러의 동작에 대한 로직을 작성해야 합니다. 이 메커니즘은 두 가지 문제를 야기합니다.
- 코드 복제; 그리고
- 단일 책임 원칙 위반; 이제 작업이 로깅의 추가 작업을 수행합니다.
로깅 로직을 사용자 지정 작업 필터 내에 넣고 모든 컨트롤러의 수준에서 필터를 적용하여 위의 문제를 완화할 수 있습니다.
아래 이미지와 같은 소스 코드를 본 적이 있습니까? [Authorize]는 권한 부여 필터이며 HTPP 요청 또는 Action 메서드 실행 전에 실행됩니다. 권한 부여 필터는 MVC의 일부이지만 필요한 경우 사용자 지정 필터도 만들 수 있습니다.
![[Authorize] is an Authorization filter, and it gets executed before any HTPP request or Action method execution. [Authorize]는 권한 부여 필터이며 HTPP 요청 또는 Action 메서드 실행 전에 실행됩니다.](/community/cfs-filesystemfile/__key/CommunityServer.Blogs.Components.WeblogFiles/dhananjay_5F00_kumar.filtermvc/2844.pic1.png)
ASP.NET MVC 에는 네 가지 유형의 필터가 있습니다.
- 인증 필터
- Authorization Filter
- 작업 필터
- Result Filter
- 예외 필터
다양한 필터를 실행하는 순서는 다음과 같습니다.
- 인증 필터는 다른 필터 또는 작업 방법보다 먼저 실행됩니다
- 권한 부여 필터는 인증 필터 뒤, 다른 필터 또는 작업 메서드 앞에 실행됩니다
- Action 필터는 모든 action 메소드 전후에 실행됩니다.
- 결과 필터는 작업 결과를 실행하기 전과 후에 실행됩니다
- 예외 필터는 작업 메서드, 필터 또는 작업 결과에서 예외가 발생하는 경우에만 실행됩니다
다이어그램에서 아래와 같이 필터 실행 순서를 나타낼 수 있습니다.

각 필터에는 고유한 용도가 있지만 대부분의 경우 사용자 지정 작업 필터를 작성하게 됩니다. 작업 실행 전후에 실행됩니다.
Custom Action Filter
우리는 다양한 이유로 사용자 정의 작업 필터를 작성합니다. 로깅을 위한 사용자 지정 작업 필터가 있거나 작업을 실행하기 전에 데이터베이스에 데이터를 저장할 수 있습니다. 데이터베이스에서 데이터를 가져와 응용 프로그램의 전역 값으로 설정하기 위한 것도 가질 수 있습니다. 다음을 포함하되 이에 국한되지 않는 다양한 이유로 사용자 지정 작업 필터를 만들 수 있습니다.
- 특권(privileged) 권한 부여 작성
- 사용자 요청 로깅
- 이미지 업로드 전처리
- 레이아웃 메뉴에 표시할 데이터 가져오기
- 응용 프로그램의 지역화
- 특정 작업을 수행하기 위해 브라우저 사용자 에이전트 정보 읽기
- Caching, etc.
사용자 지정 작업 필터를 만들려면 다음 작업을 수행해야 합니다.
- Create a class
- Inherit it from ActionFilterAttribute class
- 다음 방법 중 하나 이상을 재정의합니다.
- OnActionExecuting– 이 메서드는 컨트롤러 작업이 실행되기 전에 호출됩니다.
- OnActionExecuted– 이 메서드는 컨트롤러 작업이 실행된 후 호출됩니다.
- OnResultExecuting– 이 메서드는 컨트롤러 작업 결과가 실행되기 전에 호출됩니다.
- OnResultExecuted– 이 메서드는 컨트롤러 작업 결과가 실행된 후 호출됩니다.
가장 단순한 방식으로 두 가지 작업을 수행하는 사용자 지정 작업 필터를 만들어 보겠습니다. 물론 사용자 지정 작업 필터 내에 보다 정교한 코드를 작성할 수 있지만 다음 두 가지 작업을 수행하는 MyFirstCustomFilter 라는 이름의 사용자 지정 필터를 만들 것입니다.
- 전역 ViewBag에서 일부 데이터 값을 설정합니다.
- 들어오는 요청을 컨트롤러 작업 메서드에 기록합니다.
필터는 아래 목록과 같이 생성할 수 있습니다.
using System; using System.Diagnostics; using System.Web.Mvc; namespace WebApplication1 { public class MyFirstCustomFilter : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { //You may fetch data from database here filterContext.Controller.ViewBag.GreetMesssage = "Hello Foo"; base.OnResultExecuting(filterContext); } public override void OnActionExecuting(ActionExecutingContext filterContext) { var controllerName = filterContext.RouteData.Values["controller"]; var actionName = filterContext.RouteData.Values["action"]; var message = String.Format("{0} controller:{1} action:{2}", "onactionexecuting", controllerName, actionName); Debug.WriteLine(message, "Action Filter Log"); base.OnActionExecuting(filterContext); } } }
위의 목록에서는 실행 중인 컨트롤러에 대한 ViewBag 속성을 설정하기만 하면 됩니다. ViewBag 속성은 OnResultExecuting 메서드를 재정의하기 때문에 컨트롤러 작업 결과가 실행되기 전에 설정됩니다. 또한 컨트롤러의 작업 메서드에 대한 정보를 기록하기 위해 OnActionExecuting을 재정의하고 있습니다.
이제 사용자 지정 작업 필터를 만들었습니다. 이제 세 가지 가능한 수준에서 적용할 수 있습니다.
- 글로벌 필터로 사용
- 컨트롤러 수준에서
- 작업 수준에서
전역 필터로 적용
App_Start\FilterConfig의 전역 필터에 필터를 추가하여 전역 수준에서 사용자 지정 필터를 적용할 수 있습니다. 전역 수준에서 추가되면 MVC 응용 프로그램의 모든 컨트롤러에서 필터를 사용할 수 있습니다.
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new MyFirstCustomFilter()); } }
컨트롤러 수준에서 필터링
컨트롤러 수준에서 필터를 적용하려면 특정 컨트롤러에 속성으로 적용할 수 있습니다. 컨트롤러 레벨로 적용되면 특정 컨트롤러의 모든 작업에서 작업을 사용할 수 있습니다. 아래 목록과 같이 MyFirstCustomFilter를 HomeController에 적용할 수 있습니다.
[MyFirstCustomFilter] public class HomeController : Controller { public ActionResult Index() { return View(); } }
작업 수준에서 필터링
마지막으로, 특정 작업에 필터를 적용하려면 아래 목록과 같이 Action의 속성으로 적용할 수 있습니다.
[MyFirstCustomFilter] public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); }
이것이 사용자 정의 작업 필터에 대한 전부입니다! 이 게시물이 도움이 되었기를 바라며 읽어 주셔서 감사합니다. 덧붙일 말이 있으신가요? 부담없이 댓글을 남겨주세요!