AutoMapper -1

왜 사용하는가? - 도메인 객체와 viewmodel사이를 매핑해주기 위해서 사용한다. 중요한 것은 전체 어플리케이션에서 한번만 매핑관련 정보를 세팅하고 그걸 계속 사용한다는 것이다.

AutoMapper 설치

nugget package manager 설치

Install-Package AutoMapper
  • mvc프로젝트를 Global.asx에 정의해놓으면 전체 어플리케이션에 적용이 된다.
  • webapi 는 Startup.cs 에 정의해두자.

기본 사용법

객체가 두개가 있다. 하나는 디비에 저장하기 위한 엔티티 객체 두번째는 화면에 뿌리기 위한 viewmodel

public class Order
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string DeliveryAddress { get; set; }
    public string DeliveryZipCode { get; set; }
    public string EmailAddress { get; set; }
    public DateTime OrderDate { get; set; }
}

public class OrderViewModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string DeliveryAddress { get; set; }
    public string DeliveryZipCode { get; set; }
    public string EmailAddress { get; set; }
    public string CardNumber { get; set; }
    public string CardType { get; set; }
    public string CVV { get; set; }
    public string ExpirationMonth { get; set; }
    public string ExpirationYear { get; set; }
    public string BillingAddress { get; set; }
    public string BillingZipCode { get; set; }
}

이제 이 클래스를 사용하는 코드이다. 전체 어플리케이션에 많은곳에 이 코드가 중복된다.

    Order order = new Order();
    order.Name = vm.Name;

    order.DeliveryAddress = vm.DeliveryAddress;
    order.DeliveryZipCode = vm.DeliveryZipCode;
    order.EmailAddress = vm.EmailAddress;
    order.OrderDate = DateTime.Now;
    order.DeliveryStatus = 1;
    return View(order);

코드가 중복이라 별로 좋지 않다.

수정후 코드는 다음과 같다. 아주 간단해진다.

OrderViewModel OrderCreate = Mapper.Map<Order,OrderViewModel>(Order);

객체를 쓰는곳마다 이 매핑해주는 코드가 있다. 특정 코드에는 항상 들어가야할 orderDate가 빠져잇는경우도 있엇다. 그래서 에러가 나기도 함

AutoMapper를 사용하면 어떻게 매핑을 할지 한곳에 정의해주고 나머지에서는 매핑만 하면 정의된 규칙대로 매핑을 해준다.

다시한번 이야기하지만 전체 어플리케이션에서 단 한번만 매핑관련 정보를 정의하고 나머지는 그냥 사용한다.

추가 예제

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public Address HomeAddress { get; set; }
    public string GetFullName
    {
        get
        {
            return string.Format({0} {1}, FirstName, LastName);
        }
    }
}

public class Address
{
    public string Address1 { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

public class CustomerView
{
    public string FullName { get; set; }
    public string Email { get; set; }
    public string HomeAddressCity { get; set; }
}

//설정하자.
Mapper.Initialize(cfg =>
{
     Mapper.CreateMap<Customer, CustomerView>();
}

//실제 사용시
CustomerView customerView = Mapper.Map<Customer, CustomerView>(_customer);

프로퍼티 이름이 같으면 자동으로 다 맞춰서 매핑된다. 이거 한번만 해두고 나면 전체 어플리케이션에서 매핑만 하면 코드 중복이 줄어든다.

FullName 은 어떻게 들어간걸가?

public string GetFullName 에서 Get을 지우고 매핑한다.

HomeAddressCity 는 어떻게?

HomeAddressCity 는 Customer.HomeAddress.City 를 매핑..

Customer가 address클래스를 참조하고 있고 거기에 City라는 프로퍼티가 잇으므로 저렇게 자동 매핑이 가능하다.

혹시 잘못된부분이 있으면 teamsmiley@gmail.com으로 이메일 부탁 드립니다.

관련 글

AutoMapper - 1 https://teamsmiley.github.io/2016/12/22/automapper-1

AutoMapper - 2 https://teamsmiley.github.io/2016/12/23/automapper-2

AutoMapper - 3 https://teamsmiley.github.io/2016/12/23/automapper-3

AutoMapper - 4 https://teamsmiley.github.io/2016/12/23/automapper-4

AutoMapper - 5 https://teamsmiley.github.io/2016/12/26/automapper-5

동영상 강의

http://channel9.msdn.com/posts/ASPNET-MVC-With-Community-Tools-Part-10-AutoMapper

http://www.dnrtv.com/?showNum=155

참고 사이트

https://github.com/AutoMapper/AutoMapper/wiki

http://funnygangstar.tistory.com/entry/AutoMapper%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EA%B0%9D%EC%B2%B4%EA%B0%84-%EB%A7%B5%ED%95%91

teamsmiley's profile image

teamsmiley

2016-12-22 00:00

Read more posts by this author