dev/asp.net, c#

[.NET Core] AddTransient() AddScoped(), AddSingleton() 서비스 생명주기 차이 예제

코딩for 2022. 11. 23. 14:14
반응형

 

서비스의 수명은 종속성이 인스턴스화되는 시기와 수명에 따라 다르며 수명은 이러한 서비스를 등록한 방법에 따라 달라집니다.
 
아래 세 가지 방법은 서비스의 수명을 정의합니다.
  1. AddTransient
    Transient 는 서비스가 요청될 때마다 새롭게 생성됩니다. 

  2. AddScoped
    Scoped 서비스는 요청당 한 번 생성됩니다. 연결이 유지되는동안 재사용합니다.

  3. AddSingleton
    Singleton 서비스는 처음 요청될 때 생성되며 이후의 모든 요청은 동일한 인스턴스를 사용합니다.

 

예제를 통해서 서비스의 수명주기를 알아보기 위한 테스트는 WebAPI 프로젝트로 진행합니다.

 

서비스 생성

1. 테스트에서 사용할  Singleton, Scoped, Transient  3개의 인터페이스와 구현 클래스를 생성합니다.

// Singleton Service
namespace WebAPISampleNet5.Services
{
    public interface IServiceSingleton
    {
    }

    public class ServiceSingleton : IServiceSingleton
    {
    }
}

// Scoped Service
namespace WebAPISampleNet5.Services
{
    public interface IServiceScoped
    {
    }

    public class ServiceScoped : IServiceScoped
    {
    }
}

// Transient Service
namespace WebAPISampleNet5.Services
{
    public interface IServiceTransient
    {
    }

    public class ServiceTransient : IServiceTransient
    {
    }
}

 

2. 테스트를 위해 생성한 서비스를 의존성을 주입합니다.

//Startup.cs
services.AddSingleton<IServiceSingleton, ServiceSingleton>();
services.AddScoped<IServiceScoped, ServiceScoped>();
services.AddTransient<IServiceTransient, ServiceTransient>();

 

3. 테스트를 위한 Controller 를 생성합니다.

namespace WebAPISampleNet5.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ServiceController : ControllerBase
    {
        // 각각의 서비스 객체를 생성
        private IServiceSingleton _singleton;
        private IServiceScoped _scoped1;
        private IServiceScoped _scoped2;
        private IServiceTransient _transient1;
        private IServiceTransient _transient2;

        public ServiceController(IServiceSingleton single, 
                                 IServiceScoped scoped1, IServiceScoped scoped2,
                                 IServiceTransient tran1, IServiceTransient tran2)
        {
            _singleton = single;
            _scoped1 = scoped1;
            _scoped2 = scoped2;
            _transient1 = tran1;
            _transient2 = tran2;
        }

        // get 메서드를 통해 해당 서비스의 해쉬값을 확인
        [HttpGet]
        public IActionResult Get()
        {
            var data = new
            {
                single = _singleton.GetHashCode(),
                scoped1 = _scoped1.GetHashCode(),
                scoped2 = _scoped2.GetHashCode(),
                transient1 = _transient1.GetHashCode(),
                transient2 = _transient2.GetHashCode(),
            };

            return Ok(data);
        }        
    }
}

 

API 를 호출 하면서 결과 확인하면

SIngleton, Scoped, Transient  에 따라서 생성되는 인스턴스 의 해쉬값을 확인할수 있습니다.

 

  • Transient   동일한 요청이더라도 항상 새 인스턴스를 반환하므로 두 요청(요청 1 및 요청 2)의 인스턴스가 다릅니다.
  • Scoped  요청당 하나의 인스턴스가 생성되고 동일한 인스턴스가 요청 간에 공유되나, 새로운 요청(새로고침) 등에서는 다른 인스턴스가 생성됩니다.
  •  Singleton   하나의 인스턴스만 생성되어 여러 애플리케이션에서 공유되기떄문에 새로고침을 하거나 다른 어플리케이션에서 접속을 해도 인스턴스가 동일합니다.

 

 

반응형