개요
ASP.NET Core에서는 Startup.cs의 ConfigureServices 메서드를 통해 서비스(의존성)를 DI 컨테이너에 등록할 수 있으며, 대표적인 등록 방식으로 AddSingleton, AddScoped, AddTransient 세 가지가 있습니다. 각 방식은 인스턴스가 생성되고 유지되는 '수명(Lifetime)'이 다르기 때문에, 애플리케이션의 특성에 맞게 선택하는 것이 매우 중요합니다.
AddSingleton – 애플리케이션 전체에서 단일 인스턴스
타입을 싱글턴(Singleton)으로 등록하면 애플리케이션 전체에서 단 하나의 인스턴스만 생성되어 모든 요청과 모든 사용자에게 공유됩니다. 마치 static 객체처럼 동작한다고 이해하면 쉽습니다.
첫 번째 요청 시점에 인스턴스가 생성되며, 이후 모든 요청에서 동일한 인스턴스가 재사용됩니다. 캐시, 설정 정보, 로깅 등 상태를 공유해야 하는 기능에 적합하지만, 여러 스레드에서 동시에 접근할 수 있으므로 반드시 스레드 안전성(Thread Safety)을 고려해야 합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<ILog, Logger>();
}
AddScoped – 요청(Request)당 하나의 인스턴스
타입을 스코프드(Scoped)로 등록하면 HTTP 요청 하나당 하나의 인스턴스가 생성됩니다. 같은 요청 내에서는 동일한 인스턴스가 공유되지만, 새로운 요청이 들어올 때마다 새로운 인스턴스가 만들어집니다.
요청 단위로 일관된 상태를 유지해야 하는 EF Core의 DbContext나 요청별 작업 처리 로직에 널리 사용되는 방식입니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ILog, Logger>();
}
AddTransient – 매번 새로운 인스턴스
타입을 트랜지언트(Transient)로 등록하면 해당 타입이 필요할 때마다 항상 새로운 인스턴스가 생성됩니다. 즉, 요청마다, 사용자마다, 그리고 동일한 요청 내에서 여러 곳에 주입될 때마다 각각 새 인스턴스가 만들어집니다.
가볍고 상태를 가지지 않는(Stateless) 서비스에 가장 적합한 방식입니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ILog, Logger>();
}
세 가지 수명 비교표
| 구분 | AddSingleton | AddScoped | AddTransient |
|---|---|---|---|
| 인스턴스 | 모든 요청/모든 사용자에게 동일한 인스턴스 | 요청당 하나 | 매번 새로 생성 |
| 해제(Dispose) 시점 | 애플리케이션 종료 시 | 요청 종료 시 | 요청 종료 시 |
| 적합한 용도 | 싱글턴 구현이 필요한 경우 (캐시, 설정 등) | 사용자·요청별로 다른 동작이 필요한 애플리케이션 | 경량화되고 상태가 없는 서비스 |
정리하면, AddSingleton은 애플리케이션 전체에서 하나의 인스턴스를, AddScoped는 요청당 하나의 인스턴스를, AddTransient는 주입될 때마다 새로운 인스턴스를 생성합니다. 서비스의 특성과 상태 관리 요구 사항에 맞는 수명을 선택하면 성능과 안정성을 모두 확보할 수 있습니다.