공부/EFCore

[EFCore] Eager Loading / Explicit Loading / Select Loading

돌멩이수프 2022. 9. 2. 16:14
728x90

 

Eager Loading

 

public static void EagerLoading()
{
    Console.WriteLine("길드 이름을 입력하세요");
    Console.Write("> ");
    string name = Console.ReadLine();

    using (var db = new AppDbContext())
    {
        Guild guild = db.Guilds.AsNoTracking()
            .Where(g => g.GuildName == name)
            .Include(g => g.Members)
                .ThenInclude(p => p.Item)
            .First();

        foreach (Player player in guild.Members)
        {
            Console.WriteLine($"TemplateId({player.Item.TemplateId}) Owner({player.Name})");
        }
    }
}

 

사용자에게 길드 이름을 얻어 그 이름으로 멤버 정보를 얻고, 그 멤버가 가진 아이템 정보를 가져오는 함수다.

Inlcude, ThenInclude를 사용하여 필요한 정보를 얻을 수 있다. DB 접근 한 번만으로 모든 정보를 로딩할 수 있다는 것이 장점이자 단점이다. 

 

 

Explicit Loading

 

public static void ExplicitLoading()
{
    Console.WriteLine("길드 이름을 입력하세요");
    Console.Write("> ");
    string name = Console.ReadLine();

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

        // 명시적
        db.Entry(guild).Collection(g => g.Members).Load(); // 길드원은 여럿이니까 Collection

        foreach (Player player in guild.Members)
        {
            db.Entry(player).Reference(p => p.Item).Load(); // 아이템은 하나니까 Reference
        }

        foreach (Player player in guild.Members)
        {
            Console.WriteLine($"TemplateId({player.Item.TemplateId}) Owner({player.Name})");
        }
    }
}

 

Eager Loading과 마찬가지로 사용자에게 길드 이름을 얻고 길드 멤버의 아이템 정보를 가져오는 함수다.

Explicit Loading은 한 단계, 한 단계 우리가 직접 코드를 작정하여 DB에 접근한 뒤 정보를 뽑아올 수 있다. 

필요한 시점에 필요한 정보만을 로딩할 수 있다는 장점이 있지만, DB 접근 비용이 높다는 단점이 있다.

 

 

Select Loading

 

public static void SelectLoading()
{
    Console.WriteLine("길드 이름을 입력하세요");
    Console.Write("> ");
    string name = Console.ReadLine();

    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를 사용해 원하는 정보를 가져올 수 있다. 필요한 정보만을 골라서 볼 수 있다는 장점이 있지만, 정보를 뽑아오고 싶을 때마다 일일이 Select를 해주어야 한다는 단점이 있다.

728x90