PYTHON · 디자인패턴
의존성 주입
의존성 주입(DI)으로 모듈 간 결합도를 낮추고 테스트 용이성을 높입니다.
디자인패턴고급DI의존성 주입dependency injection테스트
핵심 설명
의존성 주입(DI)으로 모듈 간 결합도를 낮추고 테스트 용이성을 높입니다.
Python code
from abc import ABC, abstractmethod
# 인터페이스 정의
class EmailSender(ABC):
@abstractmethod
def send(self, to: str, subject: str, body: str) -> bool: ...
class Logger(ABC):
@abstractmethod
def log(self, message: str) -> None: ...
# 구현체
class SMTPSender(EmailSender):
def send(self, to, subject, body):
print(f" [SMTP] {to}: {subject}")
return True
class ConsoleLogger(Logger):
def log(self, message):
print(f" [LOG] {message}")
# DI를 받는 서비스
class NotificationService:
def __init__(self, sender: EmailSender, logger: Logger):
self._sender = sender
self._logger = logger
def notify(self, user_email: str, message: str):
self._logger.log(f"알림 전송: {user_email}")
success = self._sender.send(user_email, "알림", message)
self._logger.log(f"결과: {'성공' if success else '실패'}")
# 프로덕션
service = NotificationService(SMTPSender(), ConsoleLogger())
service.notify("user@test.com", "주문이 접수되었습니다")
# 테스트용 Mock
class MockSender(EmailSender):
def __init__(self):
self.sent = []
def send(self, to, subject, body):
self.sent.append((to, subject))
return True
mock = MockSender()
test_service = NotificationService(mock, ConsoleLogger())
test_service.notify("test@test.com", "테스트")
print(f"전송 기록: {mock.sent}")학습 팁
생성자 주입이 가장 일반적입니다. 의존성이 명시적이고 불변 객체를 만들 수 있습니다.
주의할 점
모든 것을 DI로 처리하면 설정 코드가 복잡해집니다. 변경 가능성이 높은 의존성만 주입하세요.
자주 묻는 질문
의존성 주입란 무엇인가요?
의존성 주입(DI)으로 모듈 간 결합도를 낮추고 테스트 용이성을 높입니다.
의존성 주입 학습 시 주의할 점은 무엇인가요?
모든 것을 DI로 처리하면 설정 코드가 복잡해집니다. 변경 가능성이 높은 의존성만 주입하세요.