Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

ASP.NET Core 컨트롤러에 서비스 종속성 주입하는 방법 총정리

개요

ASP.NET Core는 내장 IoC(Inversion of Control) 컨테이너를 사용해 생성자 또는 메서드를 통해 종속성 클래스의 객체를 자동으로 주입합니다. 이를 종속성 주입(Dependency Injection, DI)이라고 합니다.

내장 컨테이너는 IServiceProvider 구현체로 표현되며, 기본적으로 생성자 주입(constructor injection)을 지원합니다. 내장 IoC 컨테이너가 관리하는 타입(클래스)들을 서비스(service)라고 부릅니다.

IoC 컨테이너가 애플리케이션 서비스를 자동으로 주입하도록 만들려면, 먼저 해당 서비스들을 IoC 컨테이너에 등록해야 합니다.

예제: 로거 인터페이스와 구현 클래스

public interface ILog
{
    void Info(string str);
}

class MyConsoleLogger : ILog
{
    public void Info(string str)
    {
        Console.WriteLine(str);
    }
}

위 예제에서 ILog는 서비스의 계약 역할을 하는 인터페이스이고, MyConsoleLogger는 이를 실제로 구현하는 구상 클래스입니다.

ConfigureServices에서 서비스 등록하기

ASP.NET Core에서는 Startup 클래스의 ConfigureServices 메서드에서 애플리케이션 서비스를 IoC 컨테이너에 등록할 수 있습니다. 이 메서드는 IServiceCollection 타입의 매개변수를 받으며, 이 컬렉션을 통해 애플리케이션에서 사용할 서비스들을 등록합니다.

아래와 같이 ConfigureServices() 메서드에서 ILog를 IoC 컨테이너에 등록할 수 있습니다.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ILog, MyConsoleLogger>();
    }
}

IServiceCollection 인스턴스가 제공하는 확장 메서드(AddSingleton, AddScoped, AddTransient 등)를 사용해 서비스를 IoC 컨테이너에 등록합니다.

등록 후 동작 방식

위 코드에서는 ILog를 서비스 타입으로, MyConsoleLogger를 해당 구현체로 지정했습니다. 이렇게 하면 ILog 서비스가 싱글톤(Singleton)으로 등록됩니다.

이후 IoC 컨테이너는 MyConsoleLogger 클래스의 단일 인스턴스를 생성하고, 애플리케이션 전체에서 ILog를 생성자나 메서드 매개변수로 요청하는 모든 클래스(예: 컨트롤러)에 자동으로 주입합니다. 덕분에 개발자는 객체 생성과 관리를 직접 처리하지 않아도 됩니다.

참고: 서비스 수명(Service Lifetime)

서비스를 등록할 때는 다음 세 가지 수명 중 하나를 선택할 수 있습니다.

  • Singleton: 애플리케이션 전체에서 단 하나의 인스턴스를 생성해 공유합니다.
  • Scoped: HTTP 요청당 하나의 인스턴스를 생성합니다.
  • Transient: 서비스가 요청될 때마다 새로운 인스턴스를 생성합니다.