Study/C#

20250327_(4) Dependency Injection, DI

joystothecore_ 2025. 3. 27. 18:51

 



의존성 주입(Dependency Injection, DI)은 객체지향 설계의 핵심 원칙으로, 객체가 필요로 하는 다른 객체를 프로그래머가 직접 생성하는 것이 아닌, 외부에서 주입 (injection) 받는 설계기법이다.

즉, 객체가 사용하는 의존 객체를 new 키워드로 생성하지 않고, 외부에서 이미 생성된 인스턴스를 전달받음으로써 결합도를 낮추는 방식이다.


1. 의존성 주입의 목적

  • 결합도 감소: 구체 클래스 대신 인터페이스에 의존
  • 유연성 향상: 구현을 바꿔도 클라이언트는 영향 없음
  • 테스트 용이: 테스트 시 Mock 객체 주입 가능
  • SOLID 원칙 중 DIP(의존 역전 원칙) 실현

2. 의존성 주입의 방식

(1) 생성자 주입 (Constructor Injection) - 가장 일반적인 방법

public interface IMessageService
{
    void Send(string msg);
}

public class EmailService : IMessageService
{
    public void Send(string msg) => Console.WriteLine($"[Email] {msg}");
}

public class Notification
{
    private readonly IMessageService _service;

    public Notification(IMessageService service)
    {
        _service = service; // 생성자 주입
    }

    public void Notify(string msg)
    {
        _service.Send(msg);
    }
}

 

 

(2) 속성 주입 (Property Injection)

public class Notification
{
    public IMessageService Service { get; set; } // 주입용 속성

    public void Notify(string msg)
    {
        Service?.Send(msg);
    }
}

  • 선택적 의존성에 유용
  • 하지만 의존성 없을 때도 실행될 수 있어 안전성 떨어짐

 

(3) 메서드 주입 (Method Injection)

public class Notification
{
    public void Notify(string msg, IMessageService service)
    {
        service.Send(msg); // 메서드 호출 시 의존성 전달
    }
}

  • 임시 의존성 전달할 때 사용
  • 다만 재사용성이 떨어질 수 있음

의존성 주입은 유연하고 확장가능한 객체지향 시스템을 만드는 핵심 도구이지만, 너무 많은 의존성을 주입할 경우 문제가 생길수 있음 (어떤문제인지 더 알아봐야 함)

의존성이 필요한 경우와 그렇지 않은 경우를 잘 구분해서 적절히 잘 사용하는 것이 핵심.

 

 

 

 

-> 왜 의존성 주입이 필요한지 주말에 직접 코드를 짜보며 비교할 것.