Skip to main content

Command Palette

Search for a command to run...

.NET Foundation 프로젝트 소개(3): AutoMapper

Published
2 min read

여러분의 시간을 아낄 수 있는 .NET Foundation에서 후원하는 유용한 프로젝트를 소개하는 시간입니다.

image.png

오늘 소개하는 프로젝트는 AutoMapper 인데요, AutoMapper는 규칙 기반의 객체 대 객체 매퍼입니다. 우리는 데이터베이스 로직과 비지니스 로직을 분리하기 위해 데이터베이스 관련 질의/결과값을 DTO(Data Transfer Object) 개체를 통해 하고 비지니스 로직에서는 DAO(Data Access Object) 개체를 이용합니다. 그렇기 때문에 DTO <--> DAO 간의 변환 작업이 필요한데 이는 굉장히 지루한 작업이 됩니다.

AutoMapper는 간단한 규칙을 통해 수백 또는 수천 줄의 코드를 제거하고 DTO 설계 정책을 적용하여 매핑을 쉽게 테스트 할 수 있도록 합니다.

https://automapper.org/

AutoMapper란?

객체-객체 매퍼로, 한 유형의 입력 객체를 다른 유형의 출력 객체로 변환해줍니다. 이런 변환 작업이 AutoMapper의 규칙을 따르는 한 거의 제로 구성으로 가능하게 됩니다.

AutoMapper를 사용하는 이유는요?

매핑 코드는 아주 지루한 작업입니다. 매핑 코드를 테스트하는 것은 더욱 더 지루합니다. AutoMapper는 유형의 간단한 구성과 매핑 테스트를 제공합니다. 진짜 질문은 "왜 개체-개체 매핑을 사용하는가?"일 텐데요, 여러가지 다른 계층을 통과하는, 예를 들어 UI/도메인 계층 또는 서비스/도메인 계층과 같은 경계에서 발생합니다. 각각의 계층은 관심사가 다르므로 개체-개체 매핑은 각 계층의 관심사가 해당 유형에만 영향을 줄 수 있는 분리된 모델이 가능하게 합니다.

AutoMapper는 어떻게 사용하나요?

개체-개체 매핑이므로 먼저 소스와 대상 유형이 필요합니다. 그다음 가장 간단한 규칙은 동일명의 속성이 있을 때 그대로 값이 매핑되는 것입니다. 가령 소스에 FirstName 속성이 있다면 이 값은 대상 FirstName으로 그대로 매핑이 됩니다. AutoMapper는 또한 유용한 기능인 Flattening(평면화)를 지원합니다.

AutoMapper는 기본적으로 null 참조 예외를 무시합니다. 이것은 의도된 설계로 원하지 않을때는 사용자 값 해석기를 이용해 변경할 수 있습니다.

소스와 대상이 있다면 MapperConfigurationCreateMap()을 통해 매핑할 수 있습니다.

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();

문서

https://docs.automapper.org/

소스코드

https://github.com/AutoMapper/AutoMapper

더 많은 지원

5 views

More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read17

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read20

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.