산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

엔티티 프레임워크 마스터: 핵심 면접 질문 50선 및 답변 (2026년판)

엔티티 프레임워크(EF) 면접을 준비한다는 것은 실제 역량을 드러내는 질문을 예측하는 것을 의미합니다. EF 면접 질문은 사고력, 성능 인식, 개념을 실무에 적용하는 방식을 드러냅니다.

EF 마스터하기는 데이터 기반 플랫폼부터 클라우드 서비스까지 현대 개발 전반의 역할로 문을 엽니다. 실무 경험은 분석 능력과 기술적 깊이를 강화하고 팀을 지원합니다. 채용 리더는 실무 문제 해결, 확장 가능한 설계, 주니어 멘토링, 신입 성장 경로를 중요시합니다.

자세히 보기…

👉 무료 PDF 다운로드: 엔티티 프레임워크 면접 질문 및 답변

1) 엔티티 프레임워크란 무엇이며 왜 사용되는가?

엔티티 프레임워크(EF)는 .NET용 마이크로소프트의 ORM(객체-관계 매핑) 프레임워크로, 개발자가 원시 SQL 대신 강력한 타입의 .NET 객체로 데이터를 다룰 수 있게 해 데이터베이스 상호작용을 단순화합니다. 이 추상화는 개발자가 친숙한 C# 구문을 사용해 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 수행할 수 있게 하며, 프레임워크가 내부적으로 이를 최적화된 SQL 쿼리로 변환합니다. EF는 상용구 데이터 액세스 코드를 줄이고 유지보수성을 개선하며 컴파일 타임 타입 안전성을 강화합니다.

예를 들어 SQL 작성 대신 다음을 사용할 수 있습니다:

var customers = context.Customers.Where(c => c.IsActive).ToList();

EF는 이 LINQ 쿼리를 SQL로 변환해 데이터베이스에서 실행하고 결과를 객체로 반환합니다.

2) 코드 우선(Code First), 데이터베이스 우선(Database First), 모델 우선(Model First) 접근법의 차이점을 설명하세요.

엔티티 프레임워크는 세 가지 주요 개발 접근법을 지원합니다:

접근법사용 시기동작
코드 우선신규 프로젝트 또는 도메인 주도 설계엔티티 클래스를 정의하면 EF가 코드에서 데이터베이스 스키마를 생성합니다.
데이터베이스 우선기존 데이터베이스EF가 기존 스키마에서 엔티티 클래스와 컨텍스트를 생성합니다.
모델 우선시각적 설계 선호 시시각적 디자이너(엔티티 디자이너)에서 모델을 설계하면 EF가 클래스와 데이터베이스를 모두 생성합니다.

각 접근법은 서로 다른 시나리오에 적합합니다: 코드 우선은 애자일 개발에 인기, 데이터베이스 우선은 레거시 데이터베이스에 선호, 모델 우선은 시각적 모델링이 중요한 경우에 적합합니다.

3) DbContext란 무엇이며 EF에서 어떤 역할을 하는가?

DbContext는 데이터베이스와의 세션을 관리하고, 엔티티 변경을 추적하며, 데이터를 데이터베이스에 저장하는 것을 조정하는 주요 클래스입니다. C# 애플리케이션과 데이터베이스 사이의 다리 역할을 합니다. DbContext를 통해 DbSet<TEntity> 속성을 정의하는데, 이는 엔티티 컬렉션을 나타내며 데이터베이스의 테이블에 매핑됩니다.

예시:

public class AppDbContext : DbContext { public DbSet<Product> Products { get; set; } }

여기서 Products는 CRUD 작업을 수행하기 위한 컬렉션 역할을 합니다. EF는 이 컨텍스트를 사용해 객체 상태를 추적하고 SaveChanges() 호출 시 SQL 명령을 생성합니다.

4) 엔티티 프레임워크에서 마이그레이션이란 무엇이며 어떻게 사용되는가?

마이그레이션은 시간이 지남에 따라 데이터베이스에 스키마 변경사항을 추적하고 적용하는 메커니즘입니다. 모델이 진화함에 따라 마이그레이션은 수동 SQL 스크립트 수정 없이 데이터베이스를 동기화 상태로 유지합니다. 코드 우선에서는 다음 명령어를 사용합니다:

Add-Migration InitialCreate Update-Database

이렇게 하면 스키마 변경을 정의하는 마이그레이션 클래스가 생성되고 데이터베이스에 적용됩니다. 마이그레이션은 데이터베이스 스키마의 버전 관리를 가능하게 하고 협업 개발을 용이하게 합니다.

5) 지연 로딩(Lazy Loading), 즉시 로딩(Eager Loading), 명시적 로딩(Explicit Loading)을 설명하세요.

관련 데이터를 효율적으로 로딩하는 것은 EF에서 중요합니다. 비교는 다음과 같습니다:

전략실행 시점일반적 용도
지연 로딩최초 접근 시 관련 데이터 로드관련 데이터가 항상 필요하지 않을 때 사용
즉시 로딩.Include()로 미리 관련 데이터 로드관련 데이터가 필요함을 알 때 사용
명시적 로딩쿼리 후 수동 로드관련 데이터 로드 시점을 정확히 제어할 때 사용

예시:

var orders = context.Orders.Include(o => o.Customer).ToList(); // 즉시 로딩

지연 로딩은 초기 쿼리를 줄여주지만 신중히 사용하지 않으면 N+1 쿼리 문제를 유발할 수 있습니다.

6) 엔티티 프레임워크에서 변경 추적(Change Tracking)이란 무엇인가?

변경 추적은 쿼리 실행 후 엔티티 상태 변경을 모니터링하는 EF의 내부 메커니즘입니다. DbContext로 엔티티를 조회하면 추적 상태가 됩니다. 속성 수정 사항이 기록되고, SaveChanges() 호출 시 EF가 적절한 SQL INSERT, UPDATE, DELETE 문을 생성합니다. 추적이 불필요한 읽기 전용 시나리오에서는 AsNoTracking()으로 변경 추적을 비활성화해 성능을 개선할 수 있습니다.

7) 엔티티 프레임워크는 동시성 충돌을 어떻게 처리하는가?

동시성 제어는 여러 사용자가 같은 데이터를 업데이트할 때 의도치 않게 서로의 변경을 덮어쓰지 않게 보장합니다. EF는 기본적으로 낙관적 동시성을 사용합니다. 일반적인 접근법은 동시성 토큰(예: RowVersion 타임스탬프) 추가입니다. EF는 SaveChanges() 시 이 토큰을 확인하고, 데이터베이스 버전과 다르면 DbUpdateConcurrencyException을 던져 충돌을 알립니다. 개발자는 이 예외를 처리해 재시도하거나 데이터 차이를 해결할 수 있습니다.

8) EF에서 탐색 속성(Navigation Properties)이란 무엇인가?

탐색 속성은 엔티티 간 관계를 정의합니다. 수동 조인 없이 연관 관계를 탐색할 수 있게 합니다(예: 일대다):

public class Order { public int Id { get; set; } public Customer Customer { get; set; } }

여기서 Customer는 Order를 관련 Customer에 연결하는 탐색 속성입니다. EF는 이 속성을 사용해 쿼리 중 관계와 조인을 자동으로 구성합니다. 탐색 속성은 외래 키와 함께 관계를 모델링합니다.

9) AsNoTracking()의 목적은 무엇인가?

AsNoTracking()은 쿼리의 변경 추적을 비활성화하며, 조회한 엔티티를 업데이트할 의도가 없는 읽기 전용 작업에 유용합니다. 메모리 사용량과 추적 오버헤드를 줄여 성능을 개선합니다. 수정 없이 대용량 데이터셋을 가져올 때 특히 유용합니다.

10) 컴파일된 쿼리(Compiled Queries)란 무엇이며 언제 사용해야 하는가?

컴파일된 쿼리는 성능 최적화 기법입니다. LINQ 쿼리 실행 시 EF는 매번 SQL로 변환합니다. 컴파일된 쿼리에서는 이 변환을 한 번만 수행하고 결과 델리게이트를 재사용해 자주 실행되거나 복잡한 쿼리의 오버헤드를 줄입니다. 동일한 쿼리가 다른 매개변수로 반복 실행되는 고트래픽 시나리오에서 사용하세요.

11) 엔티티 프레임워크의 엔티티 상태(Entity States)란 무엇이며 SaveChanges()에 어떻게 영향을 주는가?

엔티티 프레임워크는 각 엔티티의 상태를 추적해 SaveChanges() 시 수행할 데이터베이스 작업을 결정합니다. 주요 엔티티 상태:

상태설명트리거 작업
Added삽입할 새 엔티티INSERT
Modified업데이트된 기존 엔티티UPDATE
Deleted제거 표시된 엔티티DELETE
Unchanged변경 사항 없음없음
Detached컨텍스트에서 추적 안 됨없음

SaveChanges() 호출 시 EF는 엔티티 상태를 검사해 해당 SQL 명령을 실행합니다. 예: DbSet에 추가된 새 엔티티는 Added로 표시되어 INSERT 쿼리 발생.

예시:

context.Entry(product).State = EntityState.Modified; context.SaveChanges();

이렇게 하면 엔티티의 데이터베이스 레코드가 명시적으로 업데이트됩니다.

상태 이해는 데이터 동기화와 성능 제어를 개선합니다.

12) 엔티티 프레임워크 사용의 장단점은?

EF는 강력한 이점을 제공하지만 사용 사례에 따라 트레이드오프도 존재합니다.

장점단점
LINQ와 객체 모델로 데이터 액세스 단순화로우 ADO.NET 대비 성능 오버헤드
상용구 SQL 코드 감소복잡한 쿼리 시 비효율적 SQL 생성 가능
다중 데이터베이스 제공자 지원생성된 SQL 디버깅 어려움
강력한 타입으로 컴파일 타임 안전성 강화대규모 팀에서 마이그레이션 충돌 가능
코드 우선으로 빠른 프로토타이핑 가능세밀한 쿼리 제어 제한

최대 성능이 필요한 대규모 시스템에서는 여전히 로우 SQL과 EF를 혼용해 최적화합니다.

13) 엔티티 프레임워크는 관계(일대일, 일대다, 다대다)를 어떻게 처리하는가?

엔티티 프레임워크는 탐색 속성과 외래 키 연관으로 관계를 관리합니다.

관계 유형:

관계 유형설명예시
일대일각 엔티티 인스턴스가 하나의 관련 엔티티를 가짐User ↔ UserProfile
일대다한 엔티티가 여러 다른 엔티티와 관련Customer → Orders
다대다여러 엔티티가 서로 관련Student ↔ Course

일대다 관계 예시:

public class Customer { public int CustomerId { get; set; } public ICollection<Order> Orders { get; set; } }

EF는 자동으로 외래 키를 생성하고 설정에 따라 캐스케이드 삭제 규칙을 처리합니다.

플루언트 API(Fluent API)로 더 명시적 관계 매핑도 가능합니다.

14) LINQ to Entities와 LINQ to SQL의 차이점은?

기능LINQ to EntitiesLINQ to SQL
지원 데이터베이스다중(SQL Server, Oracle, MySQL 등)SQL Server만
기반 프레임워크엔티티 프레임워크ADO.NET
모델개념적 엔티티 모델데이터베이스 테이블만
매핑복잡한 매핑(상속, 연관)직접 테이블 매핑
향후 지원적극 지원지원 중단

LINQ to Entities는 엔티티 프레임워크의 일부로 더 다재다능하며, LINQ to SQL은 SQL Server와 단순한 용례로 제한됩니다. 따라서 엔터프라이즈급 개발에는 LINQ to Entities를 권장합니다.

15) ObjectContext와 DbContext의 차이점은?

기능ObjectContextDbContext
프레임워크이전 EF 버전EF 4.1+ 단순화된 API
복잡성더 장황함가볍고 쉬움
성능약간 빠르지만 사용 어려움최소 오버헤드로 단순화
변경 추적수동 설정 필요자동 추적
선호 용도레거시 시스템최신 EF / EF Core 프로젝트

DbContext는 내부적으로 ObjectContext를 래핑하지만 더 깔끔하고 직관적인 API를 제공합니다. 대부분의 최신 .NET 애플리케이션은 DbContext를 사용해야 합니다.

16) 엔티티 프레임워크에서 엔티티 수명주기(Lifecycle)를 설명하세요.

엔티티 수명주기는 생성부터 영속까지의 상태 전이를 설명합니다:

  1. 생성 – 메모리에서 엔티티 인스턴스화 (상태: Detached).
  2. 연결 – DbSet.Add()로 컨텍스트에 추가 (상태: Added).
  3. 수정 – 변경 사항 자동 감지 (상태: Modified).
  4. 영속 – SaveChanges() 호출 → SQL 명령 실행.
  5. 삭제 – 엔티티 Deleted 표시 후 데이터베이스에서 제거.

이 수명주기 이해는 데이터 문제 디버깅과 EF 컨텍스트 관리 최적화에 도움이 됩니다.

17) 엔티티 프레임워크에서 플루언트 API(Fluent API)의 용도는?

플루언트 API는 모델 관계, 제약, 매핑을 프로그래밍 방식으로 구성하는 방법을 제공하며, 주로 DbContext의 OnModelCreating() 메서드에서 사용됩니다.

데이터 어노테이션(Data Annotations)으로 표현할 수 없는 세밀한 제어를 제공합니다.

예시:

modelBuilder.Entity<Customer>() .HasMany(c => c.Orders) .WithOne(o => o.Customer) .HasForeignKey(o => o.CustomerId);

플루언트 API는 복합 키, 다대다 관계, 캐스케이드 규칙 구성에 특히 강력합니다.

18) 엔티티 프레임워크에서 데이터 어노테이션(Data Annotations)이란?

데이터 어노테이션은 모델 클래스나 속성에 직접 적용되는 어트리뷰트로 스키마 동작을 정의합니다. 플루언트 API보다 단순하지만 덜 유연합니다.

예시:

public class Product { [Key] public int ProductId { get; set; } [Required] [StringLength(50)] public string Name { get; set; } }

어노테이션은 키, 문자열 길이, 필수 필드, 관계를 정의합니다. 고급 사례에서는 보통 데이터 어노테이션과 플루언트 API를 조합합니다.

19) EF Core에서 추적되는 엔티티와 추적되지 않는 엔티티의 차이점은?

유형설명용례
추적 엔티티DbContext가 변경 사항 모니터링. 업데이트 시 기본 동작
비추적 엔티티모니터링 안 됨; .AsNoTracking()으로 조회. 읽기 전용 작업에 이상적

추적 엔티티는 더 많은 메모리를 소비하지만 EF가 변경 사항을 자동 감지합니다. 비추적 엔티티는 고빈도 읽기, 저빈도 업데이트 시나리오에서 성능을 향상시킵니다.

20) 엔티티 프레임워크에서 로우 SQL 쿼리를 실행하는 방법은?

엔티티 프레임워크는 커스텀 또는 성능 중요 쿼리를 위해 로우 SQL 실행을 허용합니다.

var result = context.Products .FromSqlRaw("SELECT * FROM Products WHERE Price > 100") .ToList();

비쿼리 명령:

context.Database.ExecuteSqlRaw("DELETE FROM Products WHERE Discontinued = 1");

이 기능은 SQL 인젝션 방지와 데이터베이스 독립적 유연성 유지를 위해 신중히 사용하세요.

21) 엔티티 프레임워크와 엔티티 프레임워크 코어의 차이점은?

엔티티 프레임워크(EF)와 엔티티 프레임워크 코어(EF Core)는 아키텍처, 기능, 크로스플랫폼 지원에서 다릅니다.

기능엔티티 프레임워크 6 (EF6)엔티티 프레임워크 코어
플랫폼.NET Framework만크로스플랫폼(.NET 5/6/7)
아키텍처ObjectContext 기반경량 모듈식
성능일부 쿼리에서 느림최적화된 쿼리 생성
LINQ 지원성숙하지만 제한적향상된 변환 및 비동기
데이터베이스 제공자SQL Server, Oracle다중(MySQL, PostgreSQL, SQLite 등)
기능성숙(예: 지연 로딩)현대적(예: 섀도 속성, 전역 필터)

EF Core는 현대적이고 적극 개발 중인 버전으로, 유연성과 성능 덕분에 새로운 .NET 프로젝트에 권장됩니다.

22) 엔티티 프레임워크에서 트랜잭션은 어떻게 작동하는가?

EF의 트랜잭션은 여러 작업이 함께 성공하거나 실패해야 할 때 데이터 무결성을 보장합니다. 기본적으로 EF는 SaveChanges()를 트랜잭션으로 래핑합니다. 수동 제어 시:

using (var transaction = context.Database.BeginTransaction()) { try { context.Customers.Add(new Customer()); context.SaveChanges(); context.Orders.Add(new Order()); context.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); } }

이는 원자성을 보장합니다. 명령 중 하나라도 실패하면 모든 변경사항이 롤백됩니다. EF는 System.Transactions와도 통합되어 분산 트랜잭션을 지원합니다.

23) 엔티티 프레임워크의 TPH, TPT, TPC 상속 전략을 설명하세요.

엔티티 프레임워크는 클래스 계층 모델링을 위한 세 가지 주요 상속 매핑 전략을 지원합니다.

전략설명예시장점단점
TPH (계층당 테이블)모든 클래스가 한 테이블 공유; 판별자 컬럼으로 타입 식별. EF Core에서 일반적단순, 빠른 쿼리테이블이 크고 희소해질 수 있음
TPT (타입당 테이블)각 서브클래스가 별도 테이블. 각 파생 클래스 별도 매핑정규화된 스키마대규모 계층에서 느린 조인
TPC (구체 클래스당 테이블)각 클래스가 중복 컬럼 가진 별도 테이블. 각 엔티티 별도 매핑높은 읽기 성능데이터 중복

대부분 개발자는 정규화나 성능 요구가 없는 한 단순함 때문에 TPH를 선호합니다.

24) 엔티티 프레임워크에서 성능 튜닝은 어떻게 하는가?

엔티티 프레임워크 성능 최적화 방법:

  1. AsNoTracking() 사용 - 읽기 전용 쿼리용.
  2. 즉시 로딩 - .Include()로 필요한 관련 엔티티만.
  3. N+1 쿼리 방지 - 프로젝션이나 Select() 사용.
  4. 컴파일된 쿼리 사용 - 자주 실행되는 작업용.
  5. 다중 삽입/업데이트 배치 - AddRange()와 SaveChanges()로.
  6. AutoDetectChanges 비활성화 - 대량 작업 시: context.Configuration.AutoDetectChangesEnabled = false;
  7. 캐싱과 페이지네이션 사용 - 대용량 데이터셋용.

잘 튜닝된 EF 구현은 개발자 생산성을 유지하면서 ADO.NET에 근접한 성능을 낼 수 있습니다.

25) EF Core에서 섀도 속성(Shadow Property)이란?

섀도 속성은 EF 모델에는 존재하지만 엔티티 클래스에는 없는 속성입니다. 변경 추적기에서 EF가 관리하며 데이터베이스에 저장됩니다.

예시:

modelBuilder.Entity<Order>() .Property<DateTime>("LastUpdated");

이로써 엔티티 클래스 수정 없이 추가 메타데이터(예: 타임스탬프, 감사 정보)를 저장할 수 있습니다.

섀도 속성 접근:

var value = context.Entry(order).Property("LastUpdated").CurrentValue;

섀도 속성은 로깅이나 감사 시나리오에 이상적입니다.

26) EF Core에서 값 변환기(Value Converters)란?

EF Core의 값 변환기는 데이터베이스에서 읽거나 쓸 때 속성 값을 변환할 수 있게 합니다.

예: 열거형을 문자열로 저장:

modelBuilder.Entity<Employee>() .Property(e => e.Status) .HasConversion( v => v.ToString(), v => (EmployeeStatus)Enum.Parse(typeof(EmployeeStatus), v));

이는 enum, bool, DateTimeOffset 같은 커스텀 데이터 타입 유연성을 높입니다. 값 변환기는 민감한 데이터의 암호화, 압축, 마스킹에도 사용됩니다.

27) 전역 쿼리 필터(Global Query Filters)란 무엇이며 어떻게 작동하는가?

전역 쿼리 필터는 엔티티의 모든 쿼리에 조건을 자동 적용합니다.

특히 소프트 삭제나 멀티테넌시에 유용합니다.

예시:

modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);

Employee에 대한 모든 쿼리가 자동으로 소프트 삭제된 레코드를 제외합니다(명시적 재정의 시 제외). 전역 필터는 유지보수성과 데이터 보안을 개선합니다.

28) 엔티티 프레임워크 코드를 단위 테스트로 테스트하는 방법은?

실제 데이터베이스 없이 EF 로직을 단위 테스트하려면 인메모리 데이터베이스나 모킹을 사용하세요:

단위 테스트는 다음을 검증해야 합니다:

EF Core InMemory 테스트는 속도를 보장하고 SQL Server 의존성을 제거합니다.

29) EF에서 리포지토리(Repository)와 작업 단위(Unit of Work) 패턴을 설명하세요.

이 두 아키텍처 패턴은 데이터 액세스 추상화와 트랜잭션 일관성 유지를 돕습니다.

패턴목적구현 예시
리포지토리각 엔티티의 CRUD 작업 캡슐화IRepository<T> 인터페이스에 Add(), GetAll() 등
작업 단위트랜잭션 내에서 다중 리포지토리 조정SaveChanges()가 커밋 경계 역할

예시:

public class UnitOfWork : IUnitOfWork { private readonly AppDbContext _context; public void Commit() => _context.SaveChanges(); }

이 패턴들은 대규모 엔터프라이즈 애플리케이션에서 테스트 가능성, 코드 재사용, 관심사 분리를 개선합니다.

30) 즉시 로딩(Eager Loading)과 프로젝션 로딩(Projection Loading)의 차이점은?

측면즉시 로딩프로젝션 로딩
목적관련 데이터 미리 로드특정 필드나 속성만 로드
메서드.Include().Select()
예시context.Orders.Include(o => o.Customer)context.Orders.Select(o => new { o.Id, o.Customer.Name })
성능전체 객체 가져옴최소 데이터만 가져옴
용례처리를 위해 관련 엔티티 필요 시가벼운 특정 데이터 필요 시

프로젝션 로딩은 필요한 컬럼만 선택해 메모리 오버헤드를 줄이는 성능 최적화입니다.

31) 엔티티 프레임워크 코어에서 인터셉터(Interceptors)란?

EF Core의 인터셉터는 쿼리 실행, 명령 생성, 연결 열기 같은 데이터베이스 작업을 가로채고 수정할 수 있게 합니다. EF와 데이터베이스 공급자 사이의 미들웨어 역할을 합니다.

예시: 실행된 모든 SQL 명령 로깅.

public class CommandInterceptor : DbCommandInterceptor { public override void ReaderExecuting( DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result) { Console.WriteLine($"Executing SQL: {command.CommandText}"); base.ReaderExecuting(command, eventData, result); } }

DbContextOptionsBuilder에 등록:

optionsBuilder.AddInterceptors(new CommandInterceptor());

이점:

32) EF Core는 비동기 작업을 어떻게 처리하는가?

엔티티 프레임워크 코어는 SaveChangesAsync(), ToListAsync(), FirstOrDefaultAsync() 같은 메서드로 비동기 프로그래밍을 완전히 지원합니다.

비동기 실행은 I/O 바운드 데이터베이스 작업을 대기하며 스레드를 해제해 웹 애플리케이션의 확장성 향상에 도움이 됩니다.

예시:

var customers = await context.Customers .Where(c => c.IsActive) .ToListAsync();

비동기 작업은 블로킹 호출을 줄이고 응답 시간을 개선해 고처리량 ASP.NET Core API와 마이크로서비스에서 특히 효과적입니다.

33) 엔티티 프레임워크 코어에서 연결 복원력(Connection Resiliency)이란?

연결 복원력은 애플리케이션이 네트워크 중단이나 SQL 타임아웃 같은 일시적 데이터베이스 실패에서 자동 복구하도록 돕습니다.

구성 예시:

optionsBuilder.UseSqlServer( connectionString, options => options.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null) );

여기서 EF는 실패한 작업을 최대 5회, 지연 시간 두고 재시도합니다. 이는 Azure SQL 같은 클라우드 호스팅 환경에서 일시적 장애가 흔할 때 특히 유용합니다.

34) EF Core에서 소유 엔티티 타입(Owned Entity Types)이란?

소유 엔티티는 다른 엔티티 수명주기에 전적으로 의존하는 값 객체 모델링을 허용합니다. 소유자와 같은 테이블을 공유하며 독립적으로 존재할 수 없습니다.

예시:

public class Address { public string Street { get; set; } public string City { get; set; } } public class Customer { public int Id { get; set; } public Address Address { get; set; } }

구성:

modelBuilder.Entity<Customer>().OwnsOne(c => c.Address);

용례: 자체 정체성이 없는 주소, 금액, 측정값 같은 개념 모델링.

35) 엔티티 프레임워크 코어에서 소프트 삭제(Soft Deletes) 구현 방법은?

소프트 삭제는 레코드를 물리적으로 제거하는 대신 삭제 표시합니다. 불리언 플래그와 전역 쿼리 필터로 구현합니다.

modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);

삭제 작업 시:

employee.IsDeleted = true; context.Update(employee); context.SaveChanges();

장점: 과거 데이터 보존, 쉬운 복구. 단점: 테이블 크기 증가, 신중한 필터링 로직 필요.

36) EF Core에서 컴파일된 모델(Compiled Model)이란 무엇이며 왜 사용되는가?

EF Core 6+에서 컴파일된 모델은 EF 모델 메타데이터를 .NET 어셈블리로 사전 컴파일해 시작 시간과 런타임 오버헤드를 줄입니다.

절차:

  1. 명령 실행: dotnet ef dbcontext optimize
  2. EF가 런타임에 더 빠르게 로드되는 사전 컴파일 모델 파일 생성.

이점: 초기화 지연 시간 30~40% 감소, 특히 엔티티 많은 대규모 애플리케이션에서. 용례: 고성능 마이크로서비스와 서버리스 환경.

37) 엔티티 프레임워크에서 캐싱(Caching) 구현 방법은?

캐싱은 반복적인 데이터베이스 쿼리를 줄여줍니다. 두 가지 주요 레벨:

유형설명예시
1차 캐시내장, DbContext 인스턴스별자동 관리
2차 캐시컨텍스트 간 공유 외부 캐시EFCoreSecondLevelCacheInterceptor 같은 라이브러리 사용

2차 캐싱 예시:

services.AddEFSecondLevelCache(options => { options.UseMemoryCacheProvider().DisableLogging(false); });

이는 읽기 중심 애플리케이션에서 중복 데이터베이스 조회를 피하여 성능을 크게 개선합니다.

38) EF Core는 동시성 토큰과 타임스탬프를 어떻게 관리하는가?

동시성 토큰은 멀티유저 환경에서 충돌하는 업데이트 방지용입니다. [ConcurrencyCheck]나 [Timestamp] 어트리뷰트로 속성을 동시성 토큰으로 표시할 수 있습니다.

예시:

public class Product { public int Id { get; set; } [Timestamp] public byte[] RowVersion { get; set; } }

업데이트 발생 시 EF는 이 컬럼을 WHERE 절에 포함합니다. 값 불일치 시 DbUpdateConcurrencyException 발생 — 낙관적 동시성 제어 보장.

39) EF Core에서 감사(Auditing: 생성, 수정, 삭제 추적) 구현 방법은?

감사는 누가 레코드를 생성, 수정, 삭제했는지 같은 메타데이터를 추적합니다. SaveChanges()를 오버라이드:

public override int SaveChanges() { var entries = ChangeTracker.Entries() .Where(e => e.Entity is IAuditable && (e.State == EntityState.Added || e.State == EntityState.Modified)); foreach (var entry in entries) { var auditable = (IAuditable)entry.Entity; auditable.LastModified = DateTime.UtcNow; } return base.SaveChanges(); }

인터페이스:

public interface IAuditable { DateTime Created { get; set; } DateTime LastModified { get; set; } }

이 메서드는 감사 로직을 중앙화해 일관된 데이터 거버넌스를 보장합니다.

40) 엔터프라이즈 애플리케이션에서 엔티티 프레임워크 사용 모범 사례는?

분류모범 사례이점
성능읽기 전용 쿼리에 AsNoTracking()과 프로젝션 사용오버헤드 감소
설계리포지토리와 작업 단위 패턴 구현유지보수성 개선
보안파라미터화 쿼리로 SQL 인젝션 방지데이터 보호
확장성연결 풀링과 비동기 메서드 사용고부하 처리
마이그레이션버전 관리와 자동 마이그레이션 사용스키마 관리 단순화
구성연결 문자열과 시크릿 외부화환경 격리 개선
테스트단위 테스트에 InMemory 공급자 사용테스트 실행 속도 향상
로깅EF 로깅 활성화로 성능 통찰 확보디버깅 용이

이 관행들은 엔티티 프레임워크 기반의 견고하고 확장 가능하며 유지보수하기 쉬운 애플리케이션을 보장합니다.

41) 더 나은 SQL 변환을 위해 LINQ 쿼리를 최적화하는 방법은?

엔티티 프레임워크는 LINQ 쿼리를 자동으로 SQL로 변환하지만 비효율적 패턴은 느리거나 중복된 SQL을 생성할 수 있습니다. LINQ 최적화로 ORM이 성능 좋은 데이터베이스 쿼리를 생성하도록 합니다.

최적화 기법:

프로젝션 사용:

  1. 전체 엔티티 대신 필요한 컬럼만 선택.
var customers = context.Customers .Select(c => new { c.Id, c.Name }) .ToList();

클라이언트 측 평가 방지:
필터링이 SQL에서 일어나도록 보장, 메모리에서 안 되게. EF Core는 클라이언트 측 평가 시 경고. AsNoTracking() 사용 - 읽기 전용 데이터용.

var orders = context.Orders.AsNoTracking().ToList();
컴파일된 쿼리 활용 - 반복 LINQ 작업용. 불필요한 .Include() 호출 방지 - 필요할 때만 관련 데이터 포함.

예시:

비효율적:

context.Customers.ToList().Where(c => c.IsActive);

효율적:

context.Customers.Where(c => c.IsActive).ToList();

42) EF Core에서 초기 데이터 시드(Seeding)하는 다양한 방법은?

데이터 시드는 데이터베이스 생성 시 기본 또는 참조 데이터가 있도록 보장합니다.

방법 1: ModelBuilder 사용

modelBuilder.Entity<Role>().HasData( new Role { Id = 1, Name = "Admin" }, new Role { Id = 2, Name = "User" } );

이렇게 하면 Update-Database 시 자동으로 데이터 삽입.

방법 2: 커스텀 시드 메서드

시작 시 코드 수동 실행:

context.Database.Migrate(); if (!context.Users.Any()) { context.Users.Add(new User { Name = "Admin" }); context.SaveChanges(); }

방법 3: SQL 스크립트

마이그레이션에서 로우 SQL 사용:

migrationBuilder.Sql("INSERT INTO Roles (Name) VALUES ('Admin')");

권장:
정적 참조 데이터는 HasData(), 동적 시작 데이터는 프로그래밍 방식 시드 사용.

43) EF Core가 데이터베이스 제공자(Database Providers)를 내부적으로 관리하는 방식은?

EF Core는 공급자 독립적(provider-agnostic)으로, 별도 데이터베이스 공급자 패키지를 통해 여러 데이터베이스 엔진을 타겟팅할 수 있습니다.

주요 제공자:

제공자NuGet 패키지데이터베이스
SQL ServerMicrosoft.EntityFrameworkCore.SqlServerMSSQL
SQLiteMicrosoft.EntityFrameworkCore.Sqlite모바일/데스크톱
PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQLPostgreSQL
MySQLPomelo.EntityFrameworkCore.MySqlMySQL
Cosmos DBMicrosoft.EntityFrameworkCore.CosmosNoSQL

내부적으로 EF Core는 다음을 위한 추상화 계층을 사용합니다:

각 제공자는 EF Core의 기본 추상화(예: RelationalDatabaseProvider, QuerySqlGenerator)를 상속한 고유 클래스를 구현합니다.

44) "분할 쿼리(Split Query)"란 무엇이며 언제 사용해야 하는가?

분할 쿼리는 EF가 대규모 복잡한 조인을 수행하는 대신 여러 SQL 쿼리를 실행하도록 합니다.

예시:

var customers = context.Customers .Include(c => c.Orders) .AsSplitQuery() .ToList();

실행 내용:

  1. 쿼리 1 → 고객 조회
  2. 쿼리 2 → 해당 고객 관련 주문 조회

이점:

단점: 데이터베이스 왕복 증가. 분할 쿼리는 메모리 문제를 일으킬 수 있는 대규모 관련 데이터를 즉시 로딩할 때 사용하세요.

45) EF 생성 SQL 명령을 효과적으로 모니터링하는 방법은?

SQL 모니터링은 느린 쿼리 디버깅과 ORM 동작 최적화에 도움이 됩니다.

SQL 로깅 방법:

  1. 콘솔 로깅
optionsBuilder .UseSqlServer(conn) .LogTo(Console.WriteLine, LogLevel.Information);
ILoggerFactory 통합
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); optionsBuilder.UseLoggerFactory(loggerFactory);
인터셉터 DbCommandInterceptor 구현으로 명령과 타이밍 캡처. 프로파일링 도구 사용 도구:

로깅은 프로덕션에서 선택적으로 활성화해 성능 오버헤드 방지.

46) ChangeTracker.DetectChanges()와 AutoDetectChangesEnabled의 차이점은?

기능DetectChanges()AutoDetectChangesEnabled
유형메서드속성
목적추적 엔티티 스캔해 변경 사항 강제 감지자동 변경 감지 활성화/비활성화
기본값수동True
용례성능 최적화 위해 명시적 호출대량 업데이트 시 비활성화

예시:

context.ChangeTracker.AutoDetectChangesEnabled = false; foreach (var item in list) { context.Add(item); } context.SaveChanges();

루프에서 자동 감지 비활성화 시 대량 작업 성능 최대 40% 향상.

47) EF Core에서 임시 테이블(Temporal Tables) 사용 방법은?

임시 테이블(SQL Server 2016 도입)은 과거 데이터를 자동 추적하게 합니다.

절차:

  1. 마이그레이션에서 임시 지원 활성화:
builder.Entity<Employee>() .ToTable("Employees", b => b.IsTemporal());
과거 데이터 쿼리:
var history = context.Employees .TemporalAsOf(DateTime.UtcNow.AddDays(-7)) .ToList();

장점: 내장 데이터 이력 추적, 감사 및 컴플라이언스, 수동 트리거 불필요. EF Core 6+ 완전한 임시 쿼리 지원.

48) EF Core가 컴파일된 쿼리와 사전 생성 모델을 함께 지원하는 방식은?

컴파일된 쿼리와 컴파일된 모델은 서로 보완하는 두 가지 성능 기능입니다.

기능목적
컴파일된 쿼리쿼리 변환 결과 캐시
컴파일된 모델모델 메타데이터 사전 컴파일

컴파일된 쿼리 예시:

static readonly Func<AppDbContext, int, Customer> _getCustomerById = EF.CompileQuery((AppDbContext ctx, int id) => ctx.Customers.FirstOrDefault(c => c.Id == id));

사용:

var customer = _getCustomerById(context, 5);

함께 사용 시: 컴파일된 모델은 시작 비용 감소, 컴파일된 쿼리는 런타임 쿼리 오버헤드 감소 — 고빈도 쿼리에 이상적.

49) 마이크로서비스 아키텍처에서 EF 사용 시 흔한 함정은?

흔한 실수:

  1. 서비스 간 공유 DbContext
    → 마이크로서비스 격리 위반.
    → 각 마이크로서비스는 자체 DbContext와 스키마 가져야 함.
  2. 수다스러운 통신 (N+1 쿼리)
    → API 호출당 EF 쿼리 최소화.
  3. 과도한 즉시 로딩
    → DTO로 필요한 것만 로드.
  4. 중앙집중식 마이그레이션
    → 각 서비스가 자체 마이그레이션 독립 관리.
  5. 트랜잭션 경계 부재
    → 교차 서비스 일관성 필요 시 분산 트랜잭션(아웃박스 패턴) 사용.
  6. SQL 공급자에 긴밀한 결합
    → 리포지토리 추상화로 데이터베이스 선택 유연성 유지.

50) ASP.NET Core에서 의존성 주입(Dependency Injection)이 DbContext와 어떻게 통합되는가?

엔티티 프레임워크는 ASP.NET Core 내장 의존성 주입(DI) 시스템과 원활하게 통합됩니다.

설정:

services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));

컨트롤러나 서비스에 주입:

public class CustomerService { private readonly AppDbContext _context; public CustomerService(AppDbContext context) { _context = context; } }

수명주기:

수명주기설명권장 용도
ScopedHTTP 요청당 하나의 컨텍스트기본값
Transient매번 새 인스턴스백그라운드 작업
Singleton전역 공유피함 (스레드 안전하지 않음)

DI 사용은 웹과 백그라운드 프로세스 전반에서 테스트 가능성, 수명주기 관리, 리소스 효율성을 보장합니다.

🔍 실전 시나리오와 전략적 답변이 담긴 엔티티 프레임워크 핵심 면접 질문 Top 10

1) 엔티티 프레임워크란 무엇이며 엔터프라이즈 애플리케이션에서 왜 사용되는가?

후보자에게 기대: 면접관은 엔티티 프레임워크에 대한 기초 이해와 실제 애플리케이션에서의 가치를 평가하려 합니다.

예시 답변: 엔티티 프레임워크는 .NET용 객체-관계 매핑 프레임워크로 개발자가 원시 SQL 대신 .NET 객체로 데이터베이스를 다룰 수 있게 합니다. 엔터프라이즈 애플리케이션에서 생산성 향상, 상용구 데이터 액세스 코드 감소, 관심사 분리 유지를 위해 사용됩니다.

2) 코드 우선, 데이터베이스 우선, 모델 우선 접근법의 차이점을 설명할 수 있는가?

후보자에게 기대: 면접관은 다양한 개발 워크플로 지식과 각각을 언제 사용하는지 평가하려 합니다.

예시 답변: 코드 우선은 도메인 클래스로 시작해 코드에서 데이터베이스를 생성합니다. 데이터베이스 우선은 기존 데이터베이스에서 시작해 엔티티 클래스를 생성합니다. 모델 우선은 시각적 디자이너로 모델을 정의한 후 코드와 데이터베이스를 모두 생성합니다. 각 접근법은 프로젝트 요구사항과 기존 인프라에 따라 선택됩니다.

3) 엔티티 프레임워크는 테이블 간 관계를 어떻게 처리하는가?

후보자에게 기대: 면접관은 데이터 모델링과 관계형 매핑 이해도를 확인하려 합니다.

예시 답변: 엔티티 프레임워크는 탐색 속성과 외래 키로 관계를 처리합니다. 일대일, 일대다, 다대다 관계를 지원하며 개발자가 조인 대신 객체 참조로 관련 데이터를 탐색할 수 있게 합니다.

4) 엔티티 프레임워크를 사용해 데이터베이스 성능을 개선했던 상황을 설명해 달라.

후보자에게 기대: 면접관은 최적화 기술을 보여주는 실무 예시를 원합니다.

예시 답변: 이전 역할에서 불필요한 즉시 로딩을 줄이고 Select 문으로 프로젝션 쿼리를 구현해 성능을 개선했습니다. 이는 데이터베이스에서 가져오는 데이터 양을 최소화하고 쿼리 실행 시간을 크게 단축했습니다.

5) 엔티티 프레임워크에서 마이그레이션을 어떻게 관리하는가?

후보자에게 기대: 면접관은 스키마 변경과 버전 관리 경험을 평가하려 합니다.

예시 답변: 마이그레이션은 모델 변경을 시간에 따라 추적하는 내장 마이그레이션 도구로 관리합니다. 이전 직장에서 마이그레이션 스크립트를 정기적으로 생성하고 적용 전 검토해 환경 간 데이터베이스 무결성을 보장했습니다.

6) 지연 로딩이란 무엇이며 언제 사용을 피해야 하는가?

후보자에게 기대: 면접관은 데이터 로딩 전략 이해와 성능 트레이드오프를 테스트하려 합니다.

예시 답변: 지연 로딩은 관련 데이터에 접근할 때 자동 로드합니다. 성능 중요한 시나리오나 API에서는 피합니다. 의도치 않은 다중 데이터베이스 호출로 N+1 쿼리 문제를 유발할 수 있기 때문입니다.

7) 엔티티 프레임워크에서 트랜잭션을 어떻게 처리하는가?

후보자에게 기대: 면접관은 데이터 일관성과 에러 처리 지식을 평가하려 합니다.

예시 답변: 엔티티 프레임워크는 DbContext와 TransactionScope로 트랜잭션을 지원합니다. 이전 직장에서 여러 관련 데이터베이스 작업이 함께 성공하거나 실패 시 롤백되도록 명시적 트랜잭션을 사용했습니다.

8) 엔티티 프레임워크에서 의존성 주입은 어떻게 사용되는가?

후보자에게 기대: 면접관은 현대적 애플리케이션 아키텍처 이해도를 확인하려 합니다.

예시 답변: 의존성 주입은 DbContext를 서비스나 컨트롤러에 주입하는 데 사용됩니다. 컨텍스트를 모킹하거나 교체할 수 있어 비즈니스 로직 변경 없이 테스트 가능성과 유지보수성을 개선합니다.

9) 엔티티 프레임워크에서 겪었던 까다로운 버그와 해결 방법을 설명해 달라.

후보자에게 기대: 면접관은 문제 해결 능력과 디버깅 기술을 찾습니다.

예시 답변: 이전 역할에서 분리된 엔티티 업데이트 시 추적 충돌 문제를 겪었습니다. 엔티티 상태를 명시적으로 설정하고 각 엔티티 인스턴스가 컨텍스트에서 하나만 추적되도록 해 해결했습니다.

10) 엔티티 프레임워크가 적합하지 않은 도구라고 판단하는 기준은?

후보자에게 기대: 면접관은 판단력과 적절한 기술 선택 능력을 이해하려 합니다.

예시 답변: 극도로 고성능 데이터 액세스나 복잡한 저장 프로시저 로직이 필요할 때 대안을 고려합니다. 그런 경우 마이크로 ORM이나 로우 ADO.NET이 더 많은 제어와 효율성을 제공할 수 있습니다.

C 언어

  1. Windows에 Dev-C++ 설치하기: 단계별 가이드
  2. C 입출력(I/O) 마스터: scanf()와 printf() 완전 정복
  3. C# switch 문 마스터하기: 문법, 예제, 모범 사례
  4. C 동적 메모리 할당: malloc, calloc, realloc, free 완벽 마스터
  5. C 전처리기(CPP) 이해: 컴파일 과정을 단순화하는 방법
  6. C# 이벤트(Event): 사용자 액션 및 시스템 알림 처리
  7. C++ for 루프 완벽 가이드: 문법, 동작 원리, 실전 예제
  8. C# 인터페이스 마스터하기: 정의, 구현, 실전 활용 사례
  9. C# 연산자 오버로딩 마스터하기: 사용자 정의 타입을 위한 연산자 재정의
  10. C# 삼항 연산자: 조건부 표현식을 간결하게 작성하는 법