의존성 주입(Dependency Injection, DI)은 객체 간의 의존 관계를 외부에서 결정하고 생성자를 통해 객체를 전달하는 디자인 패턴입니다. 이를 통해 코드의 결합도를 낮추고 유지보수성을 향상시키며, 테스트 용이성을 높일 수 있습니다. 아래에 간단한 예시 코드와 함께 설명하겠습니다.
// 서비스 인터페이스 정의
public interface IMessageService
{
void SendMessage(string message);
}
// 서비스 구현 클래스
public class EmailService : IMessageService
{
public void SendMessage(string message)
{
Console.WriteLine("Email sent: " + message);
}
}
// 의존성 주입을 받는 클래스
public class NotificationService
{
private readonly IMessageService _messageService;
// 생성자를 통한 의존성 주입
public NotificationService(IMessageService messageService)
{
_messageService = messageService;
}
public void SendNotification(string message)
{
_messageService.SendMessage(message);
}
}
// 응용 프로그램 진입점
class Program
{
static void Main(string[] args)
{
// 의존성 주입 컨테이너 설정
IMessageService emailService = new EmailService(); // 실제 서비스 객체 생성
NotificationService notificationService = new NotificationService(emailService);
// 의존성 주입을 통한 메시지 전송
notificationService.SendNotification("Hello, world!");
}
}
1. IMessageService: 메시지 전송 서비스를 위한 인터페이스입니다. 이를 통해 다양한 메시지 전송 방식을 지원할 수 있습니다.
2. EmailService: IMessageService를 구현한 이메일 전송 서비스입니다. SendMessage 메서드를 통해 이메일을 전송합니다.
3. NotificationService: 메시지를 전송하는데 사용되는 서비스를 의존성 주입으로 받습니다. 생성자를 통해 IMessageService를 인자로 받아 저장하고, SendNotification 메서드를 통해 메시지를 전송합니다.
4. Program 클래스: 응용 프로그램의 진입점입니다. 여기서는 이메일 전송 서비스를 사용하는 NotificationService를 생성하고 메시지를 전송합니다.
이 예시에서는 NotificationService가 IMessageService에 의존하고 있습니다. 이를 통해 NotificationService가 실제 메시지 전송 방법에 대해 알 필요 없이 재사용 가능한 형태로 구현할 수 있습니다. 또한, 의존성 주입 컨테이너를 사용하면 객체 생성 및 관리를 자동화하여 코드의 확장성을 높일 수 있습니다.