공부/EFCore

[EFCore] DTO 활용하기

돌멩이수프 2022. 9. 5. 16:26
728x90

 

DTO란 Data Transfer Object의 준말이다.

우리가 DB에서 원하는 정보를 빼오기 위해 Select 구문을 이용하는 기존 함수를 살펴보자.

 

using (var db = new AppDbContext())
{
    var info = db.Guilds
        .Where(g => g.GuildName == name)
        .Select(g => new
        {
            Name = g.GuildName,
            MemberCount = g.Members.Count
        })
        .First();

    Console.WriteLine($"GuildName ({info.Name}), MemberCount({info.MemberCount})");
}

 

Select 뒷 부분을 유심히 살펴보면 Guild의 정보를 뽑아오기 위해 Guild를 새롭게 가공하는 모습이다. 우리는 익명 함수 형식으로 멤버 수를 뽑아왔지만 class로 빼서 관리하는 편이 더 좋다. 이를 위해 DTO를 사용하는 예시를 살펴보자.

 

 

public class GuildDto
{
    public int GuildId { get; set; }
    public string Name { get; set; }
    public int MemberCount { get; set; }
}

 

DB에 있는 정보를 재가공하기 위해 GuildDto라는 이름으로 정보를 다시 꾸며줬다.

 

public static IQueryable<GuildDto> MapGuildToDto(this IQueryable<Guild> guild)
{
    return guild.Select(g => new GuildDto()
    {
        GuildId = g.GuildId,
        Name = g.GuildName,
        MemberCount = g.Members.Count
    });
}

 

Extansion 안에 새로운 함수를 만들어줬다. 새로 들어오는 정보를 기존 GuildDto로 들여보내주는 역할이다.

 

using (var db = new AppDbContext())
{
    var info = db.Guilds
        .Where(g => g.GuildName == name)
        .mapGuildToDto()
        .First();

    Console.WriteLine($"GuildName ({info.Name}), MemberCount({info.MemberCount})");
}

 

거추장스러운 Select가 사라지고 함수 호출로 기존과 같이 길드의 멤버 수를 알아오는 코드가 완성됐다.

728x90