대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(5) EF Core

데이터 로딩

monstro 2025. 8. 5. 11:26
728x90
반응형

- 개요

EF Core 프레임워크에서 데이터를 로딩하는 방법총 3가지가 존재합니다.

각각 다음과 같습니다.

  • Eager Loading : 즉시 로딩
  • Explicit Loading : 명시적 로딩
  • Select Loading : 선택 로딩

 

각 로딩을 수행하는 방법과 장·단점을 알아보겠습니다.

 

- 사전 작업

1) DataModel 클래스

 

새로운 Entity 클래스인 Guild를 추가하였습니다.

기본키인 GuildId와 길드의 이름을 프로퍼티로 갖고 있습니다.

그리고 Player 테이블과 관계를 맺는데, 1 : 多 관계를 맺고 있습니다.

 

 

Player 클래스Table 어트리뷰트를 추가하고

참조관계에 있는 Guild 클래스에 대한 Navigation Property를 추가하였습니다.

 

2) AppDBContext 클래스

 

Guild 클래스에 대한 DbSet을 추가하여 접근과 조작이 가능하도록 설정하였습니다.

 

3) 메인 프로그램 클래스

 

프로그램 클래스의 main 함수에서 1 / 2 / 3을 입력하면 Eager / Explicit / Select 로딩을 수행합니다.

 

4) DBCommands 클래스

 

CreateTestData 함수에서 Guild 테이블에 대한 데이터를 생성하고 로직을 추가하였습니다.

 

1) Eager Loading - 즉시 로딩

 

즉시 로딩을 통해 Guild - 소속된 Player - Player의 Item을 가져오는 로직을 위와 같이 구성하였습니다.

읽기 전용 데이터를 가져오기 위해 AsNoTracking 함수를 사용합니다.

즉시 로딩을 사용하기 위해서는 반드시 Include 함수를 포함해야 합니다.

이때, 가져온 데이터 테이블에서 참조하는 다른 데이터 테이블을 가져오기 위해 ThenInclude 함수를 사용합니다.

 

 

실행 결과는 위와 같습니다.

 

2) Explicit Loading - 명시적 로딩

 

명시적 로딩을 통해 Guild - 소속된 Player - Player의 Item을 가져오는 로직을 위와 같이 구성하였습니다.

즉시 로딩과 다르게 읽기 전용 데이터를 가져오기 위한 함수는 사용하지 않습니다.

다만, 단계를 나눠서 Guild - 소속된 Player의 데이터를 로드하고 

다음으로 소속된 Player - Player의 Item의 데이터를 로드하는 방식으로 순서를 나눠서 처리합니다.

 

이때  1 : 多 관계의 데이터를 로드하는 경우, Collection을 사용하고

1 : 1관계의 데이터를 로드하는 경우, Reference를 사용합니다.

 

 

실행 결과는 위와 같습니다.

 

3) Select Loading - 선택 로딩

 

선택 로딩을 통해 소속된 Player의 이름과 전체 플레이어의 수를 가져오는 로직을 위와 같이 구성하였습니다.

다른 로딩방식과 다르게 선택 로딩특정한 데이터를 가져오기에 매우 유리합니다.

Select 쿼리문에서 가져오는 데이터NameMemberCount 변수에 저장하였습니다.

 

- 최종 정리

각 로딩 방식의 장단점을 정리하면 다음과 같습니다.

  • Eager Loading - 즉시 로딩
    • 장점 : JOIN 쿼리처럼 DB 접근 한번으로 전부 로딩
    • 단점 : 불필요한 데이터가 포함됨
  • Explicit Loading - 명시적 로딩
    • 필요한 시점에서 필요한 데이터만 로딩 가능
    • DB 접근에 대한 비용 소모가 큼
  • Select Loading - 선택 로딩
    • 필요한 데이터만 가져올 수 있음
    • 일일이 Select 로직을 구성해야 함
728x90
반응형