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
    
    
  '공부 > EFCore' 카테고리의 다른 글
| [EFCore] Pricipal 데이터가 없을 때 Dpendent 데이터가 존재할 수 있는가? (0) | 2022.09.05 | 
|---|---|
| [EFCore] Disconnected Update (Reload / Full Update) (0) | 2022.09.05 | 
| [EFCore] DB에 존재하는 데이터 수정하기 (0) | 2022.09.05 | 
| [EFCore] DB에 이미 존재하는 사용자를 PK로 연결하려면? (0) | 2022.09.04 | 
| [EFCore] SaveChanges를 호출하면 어떤 일이 일어날까 (0) | 2022.09.04 |