
Dependency Injection
서비스 라이프타임(singleton, scoped, transient), 서비스 등록, IServiceProvider, 모범 사례
1Singleton, Scoped, Transient 라이프타임의 주요 차이점은 무엇입니까?
Singleton, Scoped, Transient 라이프타임의 주요 차이점은 무엇입니까?
답변
Singleton은 애플리케이션 라이프타임 전체에 대해 단일 인스턴스를 생성하고, Scoped는 HTTP 요청(또는 스코프)당 하나의 인스턴스를 생성하며, Transient는 주입될 때마다 새 인스턴스를 생성합니다. 이러한 라이프타임은 DI 컨테이너가 서비스를 언제, 몇 번 인스턴스화하는지를 결정합니다. 상태가 없는 공유 서비스에는 Singleton, 요청에 바인딩된 서비스(DbContext 등)에는 Scoped, 상태가 없는 경량 서비스에는 Transient를 사용합니다.
2Entity Framework Core DbContext를 등록하려면 어떤 lifetime을 사용해야 하나요?
Entity Framework Core DbContext를 등록하려면 어떤 lifetime을 사용해야 하나요?
답변
DbContext는 thread-safe하지 않고 엔티티 추적 상태를 유지하므로 Scoped lifetime으로 등록해야 합니다. 동시성 문제를 피하려면 각 HTTP 요청마다 자체 DbContext 인스턴스를 가져야 합니다. 등록은 AddDbContext로 하며, 이것이 자동으로 Scoped lifetime을 구성합니다. Singleton을 사용하면 동시성 오류가 발생하고, Transient는 너무 많은 인스턴스를 생성해 리소스를 낭비합니다.
3interface와 그 구현을 사용하여 서비스를 등록하는 방법은 무엇인가요?
interface와 그 구현을 사용하여 서비스를 등록하는 방법은 무엇인가요?
답변
서비스 등록은 AddSingleton, AddScoped 또는 AddTransient 메서드로 interface를 서비스 타입으로, 구체 클래스를 구현으로 지정하여 수행합니다. 구문은 services.Add{Lifetime}<IInterface, Implementation>()입니다. 이 방식은 의존성 역전 원칙을 따르며, 구현을 대체할 수 있게 하여 테스트를 용이하게 합니다. DI 컨테이너는 interface를 주입할 때 구체 구현을 자동으로 해결합니다.
AddScoped보다 AddSingleton을 선호해야 하는 경우는 언제인가요?
DI 시스템에서 IServiceProvider의 역할은 무엇인가요?
+21 면접 질문