.NET Foundation 프로젝트 소개(3): AutoMapper
여러분의 시간을 아낄 수 있는 .NET Foundation에서 후원하는 유용한 프로젝트를 소개하는 시간입니다.
오늘 소개하는 프로젝트는 AutoMapper 인데요, AutoMapper는 규칙 기반의 객체 대 객체 매퍼입니다. 우리는 데이터베이스 로직과 비지니스 로직을 분리하기 위해 데이터베이스 관련 질의/결과값을 DTO(Data Transfer Object) 개체를 통해 하고 비지니스 로직에서는 DAO(Data Access Object) 개체를 이용합니다. 그렇기 때문에 DTO <--> DAO 간의 변환 작업이 필요한데 이는 굉장히 지루한 작업이 됩니다.
AutoMapper는 간단한 규칙을 통해 수백 또는 수천 줄의 코드를 제거하고 DTO 설계 정책을 적용하여 매핑을 쉽게 테스트 할 수 있도록 합니다.
AutoMapper란?
객체-객체 매퍼로, 한 유형의 입력 객체를 다른 유형의 출력 객체로 변환해줍니다. 이런 변환 작업이 AutoMapper의 규칙을 따르는 한 거의 제로 구성으로 가능하게 됩니다.
AutoMapper를 사용하는 이유는요?
매핑 코드는 아주 지루한 작업입니다. 매핑 코드를 테스트하는 것은 더욱 더 지루합니다. AutoMapper는 유형의 간단한 구성과 매핑 테스트를 제공합니다. 진짜 질문은 "왜 개체-개체 매핑을 사용하는가?"일 텐데요, 여러가지 다른 계층을 통과하는, 예를 들어 UI/도메인 계층 또는 서비스/도메인 계층과 같은 경계에서 발생합니다. 각각의 계층은 관심사가 다르므로 개체-개체 매핑은 각 계층의 관심사가 해당 유형에만 영향을 줄 수 있는 분리된 모델이 가능하게 합니다.
AutoMapper는 어떻게 사용하나요?
개체-개체 매핑이므로 먼저 소스와 대상 유형이 필요합니다. 그다음 가장 간단한 규칙은 동일명의 속성이 있을 때 그대로 값이 매핑
되는 것입니다. 가령 소스에 FirstName
속성이 있다면 이 값은 대상 FirstName
으로 그대로 매핑이 됩니다. AutoMapper는 또한 유용한 기능인 Flattening(평면화)를 지원합니다.
AutoMapper는 기본적으로 null 참조 예외를 무시합니다. 이것은 의도된 설계로 원하지 않을때는 사용자 값 해석기를 이용해 변경할 수 있습니다.
소스와 대상이 있다면 MapperConfiguration
및 CreateMap()
을 통해 매핑할 수 있습니다.
var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>());
왼쪽 유형은 소스 유형이고 오른쪽 유형은 대상 유형입니다. Map()
메소드를 호출해서 매핑을 수행할 수 있습니다.
var mapper = config.CreateMapper();
// 또는
var mapper = new Mapper(config);
OrderDto dto = mapper.Map<OrderDto>(order);
대부분의 애플리케이션에서는 종속성 주입을 이용해서 IMapper
인스턴스를 통해 사용할 수 있습니다.
AutoMapper는 또한 컴파일 시점에 유형을 모르는 경우에 대한 비제네릭 버전도 있습니다.
AutoMapper는 어디에서 구성합니까?
구성은 AppDomain당 한번만 수행하면 됩니다. 일반적으로 응용 프로그램의 시작 시점입니다.
매핑을 어떻게 테스트합니까?
매핑을 테스트 하려면 다음 두가지 작업을 수행하는 테스트를 만들어야 합니다.
- 부트스트래퍼 클래스를 호출하여 모든 매핑 생성
- MapperConfiguration.AssertConfigurationsValid 호출
var config = AutoMapperConfiguration.Configure();
config.AssertConfigurationIsValid();
문서
소스코드
github.com/AutoMapper/AutoMapper
더 많은 지원
- AutoMapper.Data : ADO.NET 지원
- AutoMapper.EF6: EF6용 확장 메서드
- AutoMapper.Collection: 동등성을 통한 컬렉션 매핑
- ExpressionMapping: Linq 방식 매핑