Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 의존성 주입(Dependency Injection) 완벽 가이드: 생성자·세터·메서드 주입

의존성 주입(Dependency Injection)이란?

C#에서 의존성 주입(Dependency Injection, DI)은 느슨하게 결합된(loosely coupled) 코드를 개발하기 위해 도입된 핵심 디자인 패턴입니다. 느슨하게 결합된 코드는 유지보수가 쉽고 재사용성이 뛰어나며, 대규모 애플리케이션 개발에서 특히 큰 효과를 발휘합니다.

의존성 주입을 활용하면 클래스 내부에서 직접 의존 객체를 생성하는 대신 외부에서 필요한 객체를 전달받기 때문에, 단위 테스트 작성이 쉬워지고 모듈 간 독립성도 크게 향상됩니다.

C#에서 사용할 수 있는 의존성 주입 방식은 다음의 세 가지입니다.

1. 생성자 주입(Constructor Injection)

생성자 주입은 생성자의 매개변수를 통해 의존성을 주입하는 방식입니다. 클래스가 하나 이상의 의존성을 필요로 할 때 가장 널리 사용되며, 객체 생성 시점에 필요한 의존성을 반드시 전달받도록 강제할 수 있어 가장 안정적인 방법으로 평가됩니다.

public class OrderService
{
    private readonly IEmailService _emailService;

    public OrderService(IEmailService emailService)
    {
        _emailService = emailService;
    }
}

2. 세터 주입(Setter Injection)

세터 주입은 속성(property)의 setter를 통해 의존성을 주입하는 방식입니다. 리소스나 서비스를 필요한 시점에 선택적으로 설정할 수 있다는 장점이 있습니다. 다만 주입 전에는 값이 null일 수 있으므로, 사용하기 전에 반드시 null 여부를 확인해야 합니다.

public class ReportGenerator
{
    public ILogger Logger { get; set; }

    public void Generate()
    {
        if (Logger == null)
        {
            throw new InvalidOperationException("Logger가 설정되지 않았습니다.");
        }

        // 로그 기록 및 보고서 생성 로직
    }
}

3. 메서드 주입(Method Injection)

메서드 주입은 특정 단일 메서드에만 의존성을 주입하는 방식입니다. 해당 메서드가 호출될 때 매개변수로 의존 객체를 전달받으며, 그 의존성은 오직 그 메서드 내부에서만 사용됩니다. 일회성으로 필요한 의존성을 처리할 때 적합합니다.

public void ProcessOrder(IOrderValidator validator)
{
    // validator는 이 메서드 안에서만 사용됩니다.
}

마무리

의존성 주입은 코드의 결합도를 낮추고 테스트 용이성과 확장성을 높여주는 필수적인 설계 기법입니다. 생성자 주입, 세터 주입, 메서드 주입 각각의 특징과 장단점을 이해하고, 상황에 맞는 방식을 선택하는 것이 깔끔하고 유지보수하기 좋은 C# 코드를 작성하는 핵심입니다.