[ASP.NET Core] ASP.Net Core AutoMapper 사용하기
카테고리: ASP .NET Core
태그: ASP.NET Core AutoMapper C# Web
Mapper 란?
웹에서 작업을 하게 되면, 실제 데이터베이스를 구성하는 Entity 클래스와 데이터를 실어 나르기 위한 클래스인 Dto클래스가 생성되는것이 흔합니다. 어떤 경우에는 Entity 를 Dto로, 어떨때는 Dto를 Entity로 변환하는 작업을 많이 하게 됩니다. 예를 들어서 Dto가 5개라면 5개의 변환 함수를 만들어줘야 합니다.
이러한 중복된 작업을 방지하기 위해서 .Net 에서는 AutoMapper라는 라이브러리를 지원합니다. 해당 라이브러리를 사용하면 따로 함수를 작성하지 않고도 추상화된 Mapper를 사용하여 Entity를 Dto로, Dto를 Entity로 변환할 수 있습니다.
Mapper 클래스 사용
Mapper 라이브러리 다운로드
우선, Mapper 라이브러리를 다운받아 줍니다. 다음의 명령어를 Termianl 창에 입력합니다.
dotnet add package AutoMapper --version 13.0.1
dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection --version 13.0.1
AutoMapper와 AutoMapperDI 라이브러리의 버전을 맞춰주는것이 중요합니다. 여기서 버전이 틀리면 빌드시 문제가 될 수 있으니 주의해야 합니다.
MapperConfig 만들기
Mapper 를 사용하기 위해서는 어떤 클래스를 어디로 매핑할지 정의해주어야 합니다. 그것을 하는 클래스를 MapperConfig로 정의합니다.
using AspDemo.Models.User;
using AutoMapper;
public class MapperConfig : Profile
{
public MapperConfig()
{
CreateMap<User, UserInfoDto>().ReverseMap();
CreateMap<User, CreateNewUserDto>().ReverseMap();
}
}
여기서, ReverseMap()은 역방향 매핑도 지원할 수 있도록 해줍니다.
그 후에, 해당 설정을 컨테이너에 등록할 수 있도록 Program.cs로 가서 등록 해줍니다.
builder.Services.AddAutoMapper(typeof(MapperConfig));
여기까지하면, AutoMapper의 설정이 끝나게 됩니다.
AutoMapper 사용
이제, IMapper 인터페이스를 사용하고자하는 Context에 DI 해줍니다. 저는 Service 계층에서 사용할것이기 때문에, Service 클래스에 DI 해주었습니다.
using AspDemo.Data;
using AspDemo.Models.User;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
public class UserService : IUserService
{
public MySqlContext context;
public IMapper mapper;
public UserService(MySqlContext _context, IMapper _mapper)
{
context = _context;
mapper = _mapper;
}
public async Task<UserInfoDto?> GetUserByIdAsync(long _id)
{
var user = await context.User.FindAsync(_id);
if (user == null)
{
return null;
}
return mapper.Map<UserInfoDto>(user);
}
public async Task<List<UserInfoDto>?> GetAllUsersAsync()
{
var userEntityList = await context.User.ToListAsync();//ToListAsync 는 요소가 없을 때 리스트를 만들고 Count = 0 을 반환
return mapper.Map<List<UserInfoDto>>(userEntityList);
}
public async Task InsertNewUser(CreateNewUserDto _createNewUserDto)
{
var newUser = mapper.Map<User>(_createNewUserDto);
context.User.Add(newUser);
await context.SaveChangesAsync();
}
}
여기서 보시면, Mapper 를 사용한 코드는 다음과 같습니다.
var newUser = mapper.Map<User>(_createNewUserDto);
위 코드는 인자로 오는 createNewUserDto 를 User 클래스로 매핑하여 User 클래스를 반환하겠다 라는 뜻입니다.
이렇게 하면 Dto를 매핑하는 매 Dto 마다 작성하지 않아도 손쉽게 Dto에서 Entity로 변환할 수 있습니다.
댓글 남기기