# 종속성 삽입

> Decouple hard-coded dependencies in your code using dependency injection for easier unit testing.

Cloud Code는 DI(종속성 삽입)를 지원하며, 이 기능을 사용하면 코드에서 하드 코딩된 종속성을 분리하여 유닛 테스트를 더 쉽게 수행할 수 있습니다. DI는 .Net으로 구축한 유사 시스템을 기반으로 합니다.

Cloud Code는 다음과 같은 종속성 유형을 지원합니다.

* 싱글톤: 싱글톤 종속성은 한 번 생성된 후 필요한 곳에 삽입됩니다.
* 범위 지정: 범위 지정 종속성은 요청당 한 번씩 생성됩니다. 생성자에서 사용하든 메서드 자체에서 사용하든 둘 다 동일한 오브젝트에 연결되므로 사용 위치는 상관없습니다.
* 임시: 임시 종속성은 요청을 받을 때마다 생성됩니다. 생성자에서 임시 종속성을 요청한 후 메서드에서 다시 요청하는 경우, 이 두 요청은 두 개의 개별 인스턴스가 됩니다.

## 종속성 삽입 설정##dependency-injection-setup

종속성을 설정하려면 `ICloudCodeSetup` 인터페이스를 구현하는 클래스를 생성해야 합니다.

다음 예시에서는 싱글톤 인터페이스와 그 구현을 정의하지만 `AddScoped` 또는 `AddTransient`를 사용하여 범위 지정 종속성 또는 임시 종속성을 사용할 수도 있습니다.

*C#*

```cs
using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public interface IRandomNumber
{
    public int GetRandomNumber();
}

public class LockedRandomNumber : IRandomNumber
{
    private int randomNumber;

    public LockedRandomNumber()
    {
        randomNumber = Random.Shared.Next();
    }

    public int GetRandomNumber()
    {
        return randomNumber;
    }
}

public class ModuleConfig : ICloudCodeSetup
{
    public void Setup(ICloudCodeConfig config)
    {
        config.Dependencies.AddSingleton<IRandomNumber, LockedRandomNumber>();
    }
}
```

참고 사항

* 싱글톤은 임의의 숫자를 한 번 생성한 다음 서비스가 운영되는 동안 이 숫자를 유지합니다.
* 범위 지정의 경우 요청별로 새 인스턴스가 생성되지만 요청 위치와 관계없이 해당 요청의 숫자는 동일하게 유지됩니다.
* 임시의 경우 요청받을 때마다 새 인스턴스를 생성하므로 매번 임의의 숫자를 반환합니다.

## 종속성 삽입 사용##dependency-injection-usage

종속성 삽입을 지원하려면 다음 예시에 나온 대로 클래스 생성자와 함께 메서드에 `CloudCodeFunction` 속성을 지정합니다.

*C#*

```cs
using Unity.Services.CloudCode.Core;

namespace ExampleModule;

public struct DependencyInjectionResult
{
    public int ConstructorNumber;
    public int MethodNumber;
}

public class TestDependencyInjection
{
    private int number;

    public TestDependencyInjection(IRandomNumber randomNumber)
    {
        number = randomNumber.GetRandomNumber();
    }

    [CloudCodeFunction("TestInjection")]
    public DependencyInjectionResult TestInjection(IRandomNumber randomNumber)
    {
        return new DependencyInjectionResult
        {
            // Will always return the same number during the session
            ConstructorNumber = number,
            MethodNumber = randomNumber.GetRandomNumber(),
        };
    }
}
```

> **Warning:**
>
> **경고**: 싱글톤이 여러 요청 간에 유지되더라도 Cloud Code는 수요를 충족하기 위해 필요 시 여러 포드로 확장되므로 요청 간에 싱글톤이 서로 다를 수 있습니다.

[종속성 삽입 사용](https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection-usage#register-services-for-di)에 대한 Microsoft의 기술 자료(영문)를 참고하십시오.
