Programming/Blah Blah

의존성 주입(Dependency Injection)

휘탱 2020. 4. 10. 23:52

의존성 주입 (Dependency Injection, DI)

의존성 주입은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 객체의 의존성을 해당 객체가 아닌 외부에서 주입받도록 하는 패턴입니다.
이러한 접근 방식을 통해 모듈 간의 결합도를 낮추고 코드의 재사용성과 테스트 용이성을 높일 수 있습니다.

핵심 개념

  1. 의존성 (Dependency)
    • 하나의 객체가 다른 객체의 기능을 사용할 때, 해당 객체에 대한 의존성이 생깁니다.
      예를 들어, OrderService 클래스가 OrderRepository 클래스의 기능을 사용하면, OrderServiceOrderRepository에 의존하게 됩니다.
  2. 주입 (Injection)
    • 객체에 필요한 의존성을 외부에서 제공하는 과정을 의미합니다.
      이는 생성자, 세터 메서드, 프로퍼티 등 다양한 방식으로 구현될 수 있습니다.

장점

  1. 모듈 간의 낮은 결합도
    • 의존성 주입을 사용하면 객체가 직접적으로 특정 구현에 의존하지 않게 되므로, 코드의 결합도가 낮아집니다.
  2. 코드의 재사용성
    • 객체가 특정 구현에 직접적으로 의존하지 않기 때문에, 해당 객체를 다른 상황에서도 쉽게 재사용할 수 있습니다.
  3. 테스트 용이성
    • 의존성을 주입받는 객체는 모의 객체(mock)나 가짜 객체(stub)를 사용하여 쉽게 테스트할 수 있습니다.
  4. 유연성
    • 의존성 주입을 사용하면, 실행 시간에 객체의 의존성을 변경하거나 다른 구현을 사용하는 것이 쉬워집니다.

예제

예를 들어, OrderServiceOrderRepository의 특정 구현에 의존하는 대신, 인터페이스를 통해 의존성을 주입받도록 설계할 수 있습니다:

public interface IOrderRepository
{
    void Save(Order order);
}

public class OrderRepository : IOrderRepository
{
    // ...
    public void Save(Order order)
    {
        // Implementation here...
    }
}

public class OrderService
{
    private readonly IOrderRepository _repository;

    public OrderService(IOrderRepository repository)
    {
        _repository = repository;
    }
    // ...
}

이렇게 설계하면, OrderService는 OrderRepository의 특정 구현에 직접적으로 의존하지 않게 되므로, 다른 OrderRepository의 구현을 쉽게 교체할 수 있습니다.

반응형