ASP.NET MVC 정식 버전 출시가 임박한 가운데 Preview 5 가 공개되었다. Preview 4 공개 이후 두 달만에 발표한 것이다. ASP.NET MVC를 테스트하고 있는 많은 개발자들로부터 듣는 의견은 너무 자주 변경이 이루어진다는 것이다. Preview가 발표될 때다마 새로 배워야한다는 엄살도....
이번 Preview 5에서 달라진 점을 간단히 살펴보면...
1. Action method overload가 지원된다. 즉, 같은 action에 대해 http verb가 get 혹은 put 방식으로 접속하더라도 각각 처리할 수 있도록 overload가 지원된다. 예를 들어 사용자 신규 등록의 경우 사용자 입력을 받는 페이지를 보여주는 Get 방식의 action 하나, 입력 받은 값을 통해 실제 데이터베이스에 저장하는 Put 방식의 action 하나 이렇게 쌍으로 로직이 구성되는 것이 대부분이다. 이경우 이 두 action을 같은 action 이름을 가진 overloaded 된 두 개의 action method로 구현한다.
[AcceptVerbs("GET")]
public object Create() {}
[AcceptVerbs("POST")]
public object Create(string name, int age) {}
혹은 실제 메소드 이름은 달라도 attribute를 써서 매핑시켜줄 수도 있다.
[AcceptVerbs("GET")]
public object Create() {}
[ActionName("Create"), AcceptVerbs("Post")]
public object Save(string name, int age) {}
2. Model Binder를 추가하여 사용자가 입력한 값을 action method의 파라메타로 직접 매핑시켜준다. 이러한 기능은 웬만한 웹 프레임웍이라면 다 제공하는 기능이나 개발자의 편의성을 크게 증진시키는 방향으로 개선되었다. 개발자가 일일이 폼에서 넘어온 값을 도메인 모델의 엔티티에 매핑하는 단순 작업을 Model Binder라는 기능을 통해 자동으로 해주는 것이다. 단순한 primitive type 간의 매핑 뿐만아니라, 입력 폼과 이름이 같은 것을 포함하고 있는 complex 타입까지도 각각 자동 매핑해준다는 것. 아래 두 가지는 동일한 기능을 수행한다.
[AcceptVerbs("POST")]
public object Create(string name, int age) {}
[AcceptVerbs("POST")]
public object Create(
Person person) {}
이를 지원하기 위해서는 당연히 Model Binder를 등록하여야 한다. 즉, primitive type들과 complex type 간의 매핑 정보를 전달해주어야 한다. 이를 위해 네 가지 방법을 쓸 수 있으며 기본적으로 ComplexModelBinder가 제공되고 있으므로, 웬만한 경우에는 별도의 자체 제작한 Model Binder를 등록하지 않아도 제공되는 ComplexModelBinder를 DefaultBinder로 지정하는 것만으로 사용 가능한 기능이다.
void Application_Start()
{
....
ModelBinders.DefaultBinder = new ComplexModelBinder();
...
}
3. UpdateModel & TryUpdateModel
Model Binder가 앞쪽에서 넘어온 값을 도메인 객체에 매핑시켜주는 기능이라면, UpdateModel 메소드는 뒤쪽 (데이터베이스) 에서 가져온 모델 (즉, 도메인 객체)를 원하는 값으로 업데이트 해주는 기능이다. 이를 위해 Controller 베이스 클래스에 이 두 메소드가 추가되었다. Model Binder와 UpdateModel()을 엮으면, 앞쪽에서 사용자가 입력한 값들을 Model Binder가 도메인 객체 혹은 value object 타입에 자동 매핑시켜 Controller의 action method 까지 넘어오면, UpdateModel 메소드를 통해 이를 곧바로 뒤쪽 데이터베이스에서 읽어온 모델 객체에 업데이트 시켜준다. 이렇게 업데이트 된 모델은 DataContext.SubmitChanges()를 통해 데이터베이스에 업데이트된다.
4. 사용자 입력 validation
사용자 입력값이 적절한가를 검증하는 validation 기능 또한 모든 웹 프레임웍이 기본 제공하는 기능인데, 이를 위해 ASP.NET MVC에서는 ModelState라는 컬렉션 객체를 ViewData의 일부로 추가하였다. 즉, 사용자 입력값이 부적절할 경우 ModelState에 어떠 어떠한 입력값이 validation 에러를 유발한다는 정보를 담아 ViewData의 일부로 View Engine에 넘겨지면 View가 redering 되는 시점에 에러 메시지와 에러를 유발한 input 에 색깔로 표시가 자동으로 이루어진다. 이 ModelState는 개발자가 프로그래밍 과정에서 validation 에러 항목을 추가할 수도 있고, 앞서 설명한 Model Binder가 작업할 때 혹은 UpdateModel() 수행시 자동으로 추가된다.
5. 비지니스 룰 validation
사용자가 입력한 값이 단순 validation 로직에서 처리할 수 없는 경우, 즉 데이터베이스에 저장된 값과 비교하여야 한다거나 혹은 비지니스의 변경에 따라서 변경될 수 있는 경우는 앞서 기술한 방식의 validation은 적합하지 않다. 이와 같은 비지니스 룰 관련하여 사용자 입력값을 검증하는 기능이 이번 Preview 5 에서 제공되고 있다. 비지니스 룰에 위배되는지 검사하는 로직을 구현하고 이를 등록한 후 validation 에러 발생시, 이를 앞서 설명한 validation 에러와 마찬가지로 ModelState에 추가하여 View Engine을 통해 화면에 붉게 표시된다. 즉, 화면단 validation과 비지니스 룰 관련 validation 정보 모두 같은 ModelState에 담겨 View에 넘어가게 된다.
이와 관련하여 Html helper의 기능이 preview가 나올때 마다 확장되고 있다. Html.TextBox()라는 코드는 예전에는 HTML의 input type="text"를 렌더링하고 파라메터로 넘겨준 값으로 세팅하는 것이었다가, Preview 4에서는 값을 넘겨주지 않아도 name 속성이 같은 값을 자동으로 ViewData를 뒤져 찾아내서 세팅을 하는 것으로 기능을 추가했다가, 이제는 validation 에러까지 검색해서 해당 input type 관련하여 ModelState에 validation 에러가 기술되어 있으면 이를 근거로 빨갛게 에러 메시지를 자동으로 뿌려주는 것까지 포함하게 되었다.
좀 더 자세한 설명은 아래 Scott Guthrie의 블로그를 참조하시길...
http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx
설치를 원할 경우 codeplex에서 다운로드 받으시길...
http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16775
댓글을 달아 주세요