ASP.NET Core의 기본 제공 IoC(제어 반전) 컨테이너는 등록된 서비스 형식의 수명을 관리합니다. 컨테이너는 개발자가 지정한 수명에 따라 서비스 인스턴스를 자동으로 생성하고, 더 이상 필요하지 않으면 자동으로 삭제(Dispose)합니다.
세 가지 서비스 수명
기본 제공 IoC 컨테이너는 다음과 같은 세 가지 수명을 지원합니다.
Singleton(싱글톤) — IoC 컨테이너가 애플리케이션의 전체 수명 동안 단 하나의 인스턴스만 생성하여 모든 곳에서 공유합니다.
Transient(일시적) — 해당 서비스 형식을 요청할 때마다 매번 새로운 인스턴스를 생성합니다.
Scoped(범위) — HTTP 요청당 한 번만 인스턴스를 생성하며, 동일한 요청 내에서는 같은 인스턴스를 공유합니다.
예제
먼저 간단한 인터페이스와 구현 클래스를 정의합니다.
public interface ILog{
void info(string str);
}
class MyConsoleLogger : ILog{
public void info(string str){
Console.WriteLine(str);
}
}ServiceDescriptor 객체를 사용하면 서비스 수명을 명시적으로 지정하여 등록할 수 있습니다.
public class Startup{
public void ConfigureServices(IServiceCollection services){
// Singleton 등록
services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));
// Transient 등록
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient));
// Scoped 등록
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped));
}
}확장 메서드를 이용한 등록
실무에서는 위와 같은 방식보다 가독성이 좋은 확장 메서드를 사용하는 것이 일반적입니다. 아래 예제는 AddSingleton, AddTransient, AddScoped 확장 메서드를 활용해 서비스를 등록하는 다양한 방법을 보여줍니다.
public class Startup{
public void ConfigureServices(IServiceCollection services){
// 제네릭 타입으로 등록
services.AddSingleton<ILog, MyConsoleLogger>();
services.AddTransient<ILog, MyConsoleLogger>();
services.AddScoped<ILog, MyConsoleLogger>();
// Type 객체로 등록
services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger));
services.AddTransient(typeof(ILog), typeof(MyConsoleLogger));
services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}
}서비스의 특성과 사용 목적에 맞는 적절한 수명을 선택하는 것이 중요합니다. 상태가 없는 경량 서비스라면 Transient, 요청 범위 내에서 일관성이 필요하다면 Scoped, 애플리케이션 전체에서 하나의 인스턴스를 공유해야 한다면 Singleton을 사용하는 것이 좋습니다.