의존성 주입 (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의 구현을 쉽게 교체할 수 있습니다.

반응형

'Programming > Blah Blah' 카테고리의 다른 글

Domain Driven Design  (0) 2021.10.04
Kinematica 캐릭터 모션 매칭(Motion Matching)  (0) 2021.06.29
Voxelization  (0) 2021.02.21
Clipmaps  (0) 2021.01.27
스피드핵(SpeedHack) 검증  (0) 2020.01.21
애니메이션 자료 메모  (0) 2019.12.30
행동 트리(Behavior Tree)  (0) 2019.12.07
C# 프로젝트 관리 툴?  (0) 2019.11.16