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 |