액션 필터(Action Filter)는 액션 메서드가 실행되기 전 또는 후에 추가적인 로직을 삽입할 때 사용하는 강력한 도구입니다. OnActionExecuting 메서드는 액션 메서드가 실행되기 직전에 호출되고, OnActionExecuted 메서드는 실행이 완료된 후에 호출되므로, 이 두 메서드 안에 원하는 로직을 작성하면 됩니다.
이번 글에서는 ActionFilterAttribute를 상속받아 액션 메서드 실행 전후의 정보를 로그로 남기는 LogAttribute를 직접 만들어 보겠습니다.
LogAttribute 구현
using System;
using System.Diagnostics;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace DemoWebApplication.Controllers {
public class LogAttribute : ActionFilterAttribute {
public override void OnActionExecuting(HttpActionContext actionContext) {
Debug.WriteLine(string.Format("Action Method {0} executing at {1}",
actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()),
"Web API Logs");
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
Debug.WriteLine(string.Format("Action Method {0} executed at {1}",
actionExecutedContext.ActionContext.ActionDescriptor.ActionName,
DateTime.Now.ToShortDateString()), "Web API Logs");
}
}
}
컨트롤러 액션에 적용하기
using System.Web.Http;
namespace DemoWebApplication.Controllers {
public class DemoController : ApiController {
[Log]
public IHttpActionResult Get() {
// 비즈니스 로직 처리
return Ok();
}
}
}
DemoController의 Get 액션 메서드에 [Log] 특성을 적용했습니다. 이 특성에는 OnActionExecuting과 OnActionExecuted 메서드가 이미 구현되어 있기 때문에, 해당 액션이 호출될 때마다 실행 전후의 로그 정보가 디버그 콘솔(출력 창)에 자동으로 기록됩니다.
정리
이처럼 액션 필터를 활용하면 컨트롤러나 액션 메서드의 코드를 수정하지 않고도 로깅, 성능 측정, 인증 검증, 예외 처리 같은 공통 관심사(Cross-Cutting Concerns)를 깔끔하게 분리하여 적용할 수 있습니다. 여러 컨트롤러에 동일한 로깅 정책이 필요하다면 이렇게 만든 LogAttribute를 재사용하는 것이 가장 효율적입니다.