본문 바로가기
ASP.NET MVC

ASP.NET MVC] View Model

by Fastlane 2022. 7. 11.
728x90
반응형

View Model이란?

view에서 사용하기 위해 디자인된 model이다. 

 

온라인 상점 예시

온라인 상점 application에는 Customer, Order, Product와 같은 class가 포함된다. 

public class Customer
{
 public int Number { get; set; }
 public string FirstName { get; set; }
 public string LastName { get; set; }
 public bool Active { get; set; }
 public ServiceLevel ServiceLevel { get; set; }
 public IEnumerable<Order> Orders { get; set; }
 }
public enum ServiceLevel
{ 
 Standard,
 Premier
}
public class Order
{
 public DateTime Date { get; set; }
 public IEnumerable<Product> Product { get; set; }
 public decimal TotalAmount { get; set; }
}
public class Product
{
 public string Name { get; set; }
 public decimal Cost { get; set; }
}

관리자 화면에는 각 고객별 주문횟수, 최근주문일 리스트를 보여주는 Customer Summary page가 있다. 

UI를 만들기 위해서, domain model을 직접 사용할 수 있다. database로부터 customers list를 가져와서 loop를 돌며 view화면에서 table를 구성할 수 있다. 최근주문일을 보여주기 위해서 cutomer's Orders collection을 loop 돌아야 한다. 

이런 방식은 view가 복잡해질 수록 유지보수가 어려워진다. view model을 사용해보자. 

 

View Model (Presentation Model)

View model은 UI에 보여줄 값들과 매핑되는 단순한 object이다.  화면에는 text만 보여지기 때문에 모두 string이다. 

View model은 view에서의 의사결정을 최소화 하기 위해 디자인된다. 

public class CustomerSummary
{
 public string Name { get; set; } 
 public string Active { get; set; } 
 public string ServiceLevel { get; set; } 
 public string OrderCount { get; set;} 
 public string MostRecentOrderDate { get; set; }
}

 

database query 결과값을 바로 받아오거나, domain model로부터 계산하고 project하여 presentation model을 만들 수 있다. 둘 다, AutoMapper와 같은 mapping tool을 사용한다. 

public class CustomerSummaryController : Controller
{
  private CustomerSummaries _customerSummaries = new CustomerSummaries();
  public ViewResult Index()
  {
    IEnumerable<CustomerSummary> summaries = _customerSummaries.GetAll();
    return View(summaries); 
  }
}

ViewData.Mode

controller와 view는 ViewData라고 하는 ViewDataDictionary type object를 공유한다. 

return View(summaries)를 호출할 때, ViewData.Model은 자동으로 CustomerSummary object list값을 받는다. 

@model directive를 통해 view model type을 명시할 수 있다. 

@model IEnumerable<DisplayModel.Models.CustomerSummary>

 

728x90
반응형

댓글