[C# MapSter] 맵핑 객체 내부의 프로퍼티가 서로 다른 경우

목적

  • C# MapSter 를 이용하여 맵핑을 하려고 할 때, 객체 내부의 프로퍼티가 서로 다른 경우가 있습니다.
  • 하지만, 프로퍼티가 달라도 MapSter 에서는 맵핑 할 수 있는 방법이 있습니다.
  • 예제 코드를 작성하여 어떻게 맵핑을 진행하는지 보여 드리도록 하겠습니다.

예제 코드

  • 아래 예제에서는 Member 에서 Address 부분이 MemberDto 부분으로 Address1, Address2, Address3 로 나누어졌고, PhoneNumber 도 Tel로 변경이 되어있습니다.
public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address { get; set; } // DTO 에서 데이터가 3개로 분리됨.
    public string PhoneNumber { get; set; } // DTO에서 Tel로 변경됨.
}

public class MemberDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address1 { get; set; }  // Address  시 군
    public string Address2 { get; set; }  // Address  구
    public string Address3 { get; set; }  // Address  상세주소.
    public string Tel { get; set; } // Member.PhoneNumber과 Mapping
}
  • 위와 같이 프로퍼티 이름은 다르지만, 역할이 동일하다면 MapSter 에서는 다음과 같은 설정을 통하여 맵핑을 진행할 수 있습니다.
  • TypeAdapterConfig<변환하기 전 객체 타입, 변환 할 객체 타입> 으로 명시적으로 선언하여 사용해야 합니다.
  • 해당 코드는 Dto - Entity 변환 Config 코드이며, Dto - Entity - Dto 로 다시 변환을 원하는 경우 Entity-Dto 로 변환하는 Config도 작성해야 합니다.
// program.cs 위 예제 코드에서 아래 Config를 추가해 준다.
TypeAdapterConfig<MemberDto, Member>.NewConfig()
    .AfterMapping((src, dest) =>
    {
        dest.Address = $"{src.Address1}@@{src.Address2}@@{src.Address3}";
        dest.PhoneNumber = src.Tel;
    });

TypeAdapterConfig<Member, MemberDto>.NewConfig()
    .AfterMapping((src, dest) => //Member에서 MemberDto로 변환하는 코드
    {
        string[] split = src.Address.Split("@@");
        dest.Address1 = split[0];
        dest.Address2 = split[1];
        dest.Address3 = split[2];

        dest.Tel = src.PhoneNumber;
    });
  • 다음은 전체 예제 코드 입니다.

using Mapster;

Console.WriteLine($"MapSter Start!!");

// program.cs 위 예제 코드에서 아래 Config를 추가해 준다.
TypeAdapterConfig<MemberDto, Member>.NewConfig()
    .AfterMapping((src, dest) =>
    {
        dest.Address = $"{src.Address1}@@{src.Address2}@@{src.Address3}";
        dest.PhoneNumber = src.Tel;
    });

TypeAdapterConfig<Member, MemberDto>.NewConfig()
    .AfterMapping((src, dest) => //Member에서 MemberDto로 변환하는 코드
    {
        string[] split = src.Address.Split("@@");
        dest.Address1 = split[0];
        dest.Address2 = split[1];
        dest.Address3 = split[2];

        dest.Tel = src.PhoneNumber;
    });

MemberDto memberDto = new()
{
    Id = 99,
    Address1 = "경기도",
    Address2 = "수원시",
    Address3 = "어딘가...",
    Description = "테스트 데이터",
    Name = "Test Name",
    Tel = "010-0000-0303",
};


var member = memberDto.Adapt<Member>();

Console.WriteLine($"ID : {member.Id}");
Console.WriteLine($"Address : {member.Address}");
Console.WriteLine($"Name : {member.Name}");
Console.WriteLine($"Description : {member.Description}");
Console.WriteLine($"TelNumber : {member.PhoneNumber}");

public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address { get; set; } // DTO 에서 데이터가 3개로 분리됨.
    public string PhoneNumber { get; set; } // DTO에서 Tel로 변경됨.
}

public class MemberDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address1 { get; set; }  // Address  시 군
    public string Address2 { get; set; }  // Address  구
    public string Address3 { get; set; }  // Address  상세주소.
    public string Tel { get; set; } // Member.PhoneNumber과 Mapping
}

실행 결과

  • 실행 결과, 프로퍼티가 달라도 맵핑이 정상적으로 된 것을 확인할 수 있습니다.
MapSter Start!!
ID : 99
Address : 경기도@@수원시@@어딘가...
Name : Test Name
Description : 테스트 데이터
TelNumber : 010-0000-0303
728x90

이 글을 공유하기

댓글(0)

Designed by JB FACTORY