서로 결합되어 있는(종속적인) 객체를 분리된(독립적인) 객체로 전환하는 과정에서 의존 객체를 외부에서 주입하는 기법을 종속성 주입(Dependency Injection, DI)이라고 합니다. DI를 활용하면 클래스 간의 결합도가 낮아져 코드의 유연성과 테스트 용이성이 크게 향상됩니다.
종속성 주입의 종류
DI는 구현 방식에 따라 크게 네 가지로 나눌 수 있습니다.
- 생성자 주입(Constructor Injection) – 생성자 매개변수를 통해 의존 객체를 전달
- 세터 주입(Setter Injection) – 공개 속성(Property)의 set 접근자를 통해 의존 객체를 전달
- 인터페이스 기반 주입(Interface-based Injection) – 인터페이스에 정의된 메서드를 통해 의존 객체를 전달
- 서비스 로케이터 주입(Service Locator Injection) – 중앙화된 서비스 로케이터를 통해 필요한 객체를 조회
세터 주입(Setter Injection)이란?
세터 주입은 C#의 기본 공개 속성 문법, 즉 get { }(Getter)과 set { }(Setter) 접근자를 이용해 의존 객체를 주입하는 방식입니다. 객체 생성 이후에도 속성을 통해 의존성을 교체할 수 있어 유연한 구성이 가능합니다.
예제 코드
public interface IService
{
string ServiceMethod();
}
public class ClaimService : IService
{
public string ServiceMethod()
{
return "ClaimService가 실행 중입니다";
}
}
public class AdjudicationService : IService
{
public string ServiceMethod()
{
return "AdjudicationService가 실행 중입니다";
}
}
public class BusinessLogicImplementation
{
private IService _client;
// 세터 주입을 위한 공개 속성
public IService Client
{
get { return _client; }
set { _client = value; }
}
public void SetterInj()
{
Console.WriteLine("Getter/Setter 주입 ==> 현재 서비스 : {0}", Client.ServiceMethod());
}
}사용 예시
위 클래스는 다음과 같이 사용할 수 있습니다. Client 속성에 원하는 서비스 구현체를 할당하면 해당 의존성이 주입됩니다.
BusinessLogicImplementation ConInjBusinessLogic = new BusinessLogicImplementation(); ConInjBusinessLogic.Client = new ClaimService(); ConInjBusinessLogic.SetterInj();
이처럼 속성(Setter)을 활용한 종속성 주입은 생성자 주입과 달리 객체 생성 후에도 의존 객체를 자유롭게 교체할 수 있다는 장점이 있습니다. 다만 필수 의존성이 누락된 상태로 사용될 수 있으므로, 선택적 의존성에 적합한 패턴입니다.