본문 바로가기
유니티 공부/Unity

Unity - 의존성 주입(Dependency Injection)

by 코딩하는 돼징 2023. 12. 3.
반응형

의존성 타입(Dependency Injection)

정적 멤버 변수객체간의 의존성을 외부에서 주입하여 객체 간 결합도를 낮추고 유연성을 높인다. 이는 객체가 직접 자신이 필요로 하는 리소스를 생성하지 않고 외부에서 주입받아 사용하는 방시이다. 이를 사용하면 리소스를 생성하거나 관리하지 않아도 된다. 


1. 의존성 주입을 사용하지 않는 경우

ProduectService 클래스가 Logger클래스를 직접 생성하여 사용하고 있다. 그러므로 테스트 중에 이 의존성을 제어하기가 어렵다. 

public class Logger
{
    public void Log(string message)
    {
        Console.WriteLine($"Logging: {message}");
    }
}
public class ProductService
{
    private readonly Logger logger;

    public ProductService()
    {
        this.logger = new Logger();
    }

    public void AddProduct(string productName)
    {
        logger.Log($"Product '{productName}' added.");
    }
}
class Program
{
    static void Main()
    {
        ProductService productService = new ProductService();
        productService.AddProduct("Laptop");
    }
}

 

 

테스트에서는 종종 외부 리소스 또는 서비스를 직접 사용하지 않고 Mocking을 사용한다. 하지만 Logger가 직접 사용되는 경우 테스트 중에 MockLogger와 같은 특수한 Logger를 주입하거나 제어하기 어렵다.


Mocking  : 테스트 중에 실제 객체를 대체하는 가짜 객체를 생성하여 사용하는 행위다. 주로 외부 의존성이 있는 코드를 격리하고 해당 의존성의 동작을 테스트 중에 제어하거나 확인하기 위해 사용된다. 

MockLogger : 실제 로깅 기능을 수행하는 Logger클래스의 가짜버전이다. 테스트에서는 MockLogger를 Logger대신 사용하여 Logger동작을 제어하고 로깅이 발생하는지 여부를 확인할 수 있다.


2. 의존성 주입을 사용하는 경우

ProductService 클래스는 특정한 Logger 클래스에 직접 의존하는 대신, 로깅에 필요한 메서드를 정의한 인터페이스에 의존한다.

public interface ILogger
{
    void Log(string message);
}
public class Logger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine($"Logging: {message}");
    }
}
public class ProductService
{
    private readonly ILogger logger;

    // 생성자를 통한 종속성 주입
    public ProductService(ILogger logger)
    {
        this.logger = logger;
    }

    public void AddProduct(string productName)
    {
        logger.Log($"Product '{productName}' added.");
    }
}
class Program
{
    static void Main()
    {
        // ILogger 구현체를 주입
        ILogger logger = new Logger();
        ProductService productService = new ProductService(logger);
        productService.AddProduct("Laptop");
    }
}

 

장점

01유연성 향상

ProductService는 ILogger 인터페이스의 메서드만 사용하므로 구체적인 Logger 구현이 변경되더라도 ProductService 코드는 영향을 받지 않는다. 새로운 로깅 기능을 추가하거나 다른 로깅 라이브러리로 전환하는 등의 변경이 용이해진다.


02 테스트 용이성

테스트 시에는 MockLogger와 같은 모의(Mock) 객체를 ILogger 인터페이스에 주입하여 로깅 동작을 추적하고 제어할 수 있다. 이는 테스트 가능한 코드 작성을 용이하게 한다.

 

반응형

댓글