PHpullh

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로 처리하면 설정 코드가 복잡해집니다. 변경 가능성이 높은 의존성만 주입하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.