NonAction 특성(Attribute)은 컨트롤러 안에 public 메서드로 유지하고 싶지만, 이를 액션 메서드로 취급하고 싶지 않을 때 사용합니다. 액션 메서드란 URL을 통해 호출할 수 있는 컨트롤러의 public 메서드를 의미합니다.
기본적으로 컨트롤러에 정의된 모든 public 메서드는 URL 요청만으로 호출될 수 있습니다. 따라서 외부에 노출되어서는 안 되는 public 메서드가 있다면 NonAction 특성을 적용하여 접근을 제한해야 합니다.
예제: 두 개의 public 메서드를 가진 HomeController
다음과 같이 MyMethod1과 MyMethod2라는 두 개의 public 메서드를 가진 HomeController가 있다고 가정해 보겠습니다.
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers{
public class HomeController : Controller{
public string MyMethod1(){
return "<h1>My Method 1 Invoked</h1>";
}
public string MyMethod2(){
return "<h1>My Method 2 Invoked</h1>";
}
}
}아래 URL을 통해 HomeController의 두 메서드를 각각 호출할 수 있습니다.
https://localhost:59146/Home/MyMethod1
https://localhost:59146/Home/MyMethod2


이제 MyMethod2가 내부적인 용도로만 사용되며, URL 요청을 통한 호출은 원하지 않는 상황이라고 가정해 봅시다. 이 경우 해당 메서드에 [NonAction] 특성을 선언하기만 하면 됩니다.
NonAction 특성 적용하기
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers{
public class HomeController : Controller{
public string MyMethod1(){
return "<h1>My Method 1 Invoked</h1>";
}
[NonAction]
public string MyMethod2(){
return "<h1>My Method 2 Invoked</h1>";
}
}
}MyMethod2를 NonAction으로 지정한 후 다시 URL로 요청하면 아래와 같은 결과가 나타납니다.
실행 결과

참고 사항
ASP.NET MVC 프레임워크는 오직 public 메서드만 액션으로 간주하기 때문에, 메서드를 private 또는 protected로 선언하는 방법으로도 URL 호출을 막을 수 있습니다. 하지만 해당 메서드를 다른 클래스에서 호출해야 하는 등 public으로 유지해야 하는 상황이라면 NonAction 특성이 가장 깔끔한 해결책입니다.