728x90
반응형
- Eager loading : 일찍 데이터 로딩
- Lazy loading : 데이터 필요 직전에, 자동으로 데이터 로딩
- Explicit loading : 매뉴얼대로 데이터 로딩
Eager loading entities
IQuryable<Orders>? orders = _context.Orders?
.Include(o => o.Items);
if (orders is null) {
WriteLine("주문건 없음");
}
foreach (Order o in orders)
{
WriteLine($"{o.OrderId}의 품목개수 : {o.Items.Count}");
}
foreach 돌면서, OrderId와 Items의 개수를 가져온다. 가능한 이유는, Include 함수를 호출하여 eager loading할 수 있기 때문이다. Include 구문을 주석처리하면, 쿼리가 Orders 테이블에서만 select하기 때문에, 품목개수는 0으로 모두 표시된다.
Enabling lazy loading
lazy loading에는 아래 2가지가 필요하다.
- proxies Nuget package 참조
- proxy를 사용하도록 lazy loading 구성
1. 아래 참조구문 추가하고 project 빌드해서, package restore한다.
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="6.0.0" />
2. 아래와 같이, UseLazyLoadingProxies() 확장함수를 호출한다.
services.AddDbContext<AppDbContext>(option => option.UseSqlServer(
configuration.GetConnectionString("DefaultConnection")
.UseLazyLoadingProxies()));
이제 매 loop enumerates 시, lazy loading proxy가 데이터 로딩여부를 확인하여 Items property를 읽어오려고 시도한다. 만약 데이터가 없다면, curren order의 Items를 SELECT 쿼리를 실행해서 lazily하게 load한다.
3. 앞서 Include 구문이 주석처리된 코드를 다시 실행해보면, 정상으로 품목개수를 가져온다. 하지만, lazy loading의 문제점은 결국 모든 데이터를 가져오기 위해, database server에 여러번 접근해야 한다는 점이다. 한번 돌때마다 2번씩 database server에 접근해야 한다.
Explicit loading entities
lazy loading과 유사하게 동작하지만, 어떤 related data를 load해야하고, 언제 해야하는지 정확하게 컨트롤한다는 점이 다르다.
728x90
반응형
'Entity Framework Core' 카테고리의 다른 글
Entity Framework Core] Migrations 관리 (0) | 2023.07.20 |
---|---|
Entity Framework Core] transactions (0) | 2023.07.14 |
Entity Framework Core] .AsNoTracking()이란? (0) | 2023.06.09 |
ASP.NET Core] Entity Framework Core - Migrations (0) | 2023.05.24 |
ASP.NET Core] Entity Framework Core - database model 구성방법 (0) | 2023.05.23 |
댓글