[C# MapSter] 순환참조 인 경우 맵핑하기

목적

  • C# MapSter 를 이용하여 순환참조를 발생시키는 Entity 에 대해서 어떻게 맵핑을 진행하는지 예제를 통해 알아 보도록 하겠습니다.

예제 코드

  • 아래와 같이, Entity, Dto를 추가하였습니다.
// Entity
public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }

    public Department Department { get; set; }  // 이 부분 추가.
}
public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Ddscription { get; set; }
    public List<Member> Members { set; get; }  // 이 부분 추가.
}

public class MemberDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string Tel { get; set; }

    public DepartmentDto Department { get; set; }  // 이 부분 추가.
}

public class DepartmentDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Ddscription { get; set; }
    public List<MemberDto> Members { set; get; }  // 이 부분 추가.
}
  • 위와 같이 Dto, Entity를 변경해 주었고, 1:N 관계로 순환 참조 구조로 값을 채워 보겠습니다.
MemberDto memberDto = new()
{
    Id = 99,
    Address1 = "경기도",
    Address2 = "수원시",
    Address3 = "어딘가...",
    Description = "테스트 데이터",
    Name = "Test Name",
    Tel = "010-0000-0303",
    Department = new DepartmentDto()
    {
        Id = 99,
        Name = "어느부서..",
        Members = new List<MemberDto>()
    },
};
memberDto.Department.Members.Add(memberDto);
  • 다음으로 아래와 같이 TypeAdapterConfig에 PreserveReference(true) 를 지정해주어야 합니다.
TypeAdapterConfig<MemberDto, Member>  
    .NewConfig()
    .PreserveReference(true);
  • 전체 예제 코드입니다.

using Mapster;

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

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

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;
    })
    .PreserveReference(true);

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

Member entity = memberDto.Adapt<Member>(); 

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

// Entity
public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }

    public Department Department { get; set; }  // 이 부분 추가.
}
public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Ddscription { get; set; }
    public List<Member> Members { set; get; }  // 이 부분 추가.
}

public class MemberDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string Tel { get; set; }

    public DepartmentDto Department { get; set; }  // 이 부분 추가.
}

public class DepartmentDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Ddscription { get; set; }
    public List<MemberDto> Members { set; get; }  // 이 부분 추가.
}

실행 결과

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

이 글을 공유하기

댓글

Designed by JB FACTORY