10.3 Dependency Injection (DI, 의존성 주입)

2024. 3. 11. 23:49CS - Roadmap.sh/10. Design Patterns

※[https://roadmap.sh/computer-science]를 따라서 공부하고 기록한 글입니다.

cs - 10. Design Patterns - 10.3 Dependency Injection

Dependency Injection

Dependency injection is a software design pattern that allows us to decouple the dependencies of a class from the class itself. This allows us to write more flexible and testable code.

 

의존성 주입은 클래스의 종속성을 클래스 자체에서 분리할 수 있는 소프트웨어 디자인 패턴입니다. 이를 통해 보다 유연하고 테스트 가능한 코드를 작성할 수 있습니다.

 

 

의존성 주입(Dependency Injection)


소프트웨어 엔지니어링에서 의존성 주입(Dependency Injection, DI)은 컴포넌트 간의 의존 관계를 외부에서 결정하고 제공하는 설계 패턴입니다. 이 패턴은 컴포넌트가 자신의 의존성을 직접 생성하지 않고, 외부의 도움을 받아 해당 의존성을 주입받는 방식으로 작동합니다. 이를 통해 모듈 간의 결합도를 낮추고, 유지보수성 및 테스트 용이성을 향상시킬 수 있습니다.

 

의존성 주입의 장점


1. 결합도 감소
객체가 자신의 의존성을 직접 생성하거나 관리하지 않으므로, 모듈 간의 결합도가 현저히 감소합니다. 이는 시스템의 유연성과 확장성을 증가시킵니다.

2. 유닛 테스트 용이
의존성 주입을 사용하면, 테스트 중인 객체에 가짜(mock) 객체나 스텁(stub)을 쉽게 주입할 수 있습니다. 이는 유닛 테스트를 보다 쉽고 효율적으로 만듭니다.

3. 코드 재사용 증가
의존성 주입을 통해 개발된 컴포넌트는 보다 일반적이고 재사용 가능합니다. 이는 코드의 중복을 줄이고, 프로젝트의 일관성을 유지하는 데 도움이 됩니다.

4. 의존성 관리의 중앙화
의존성 주입을 사용하면, 모든 의존성 관리가 애플리케이션의 한 곳에서 이루어집니다. 이는 의존성 관리를 보다 효율적으로 만들어 줍니다.

 

 

 

from abc import ABC, abstractmethod

# MessageSender 인터페이스 정의
class MessageSender(ABC):
    @abstractmethod
    def send(self, message):
        pass

# EmailSender 구현
class EmailSender(MessageSender):
    def send(self, message):
        print(f"이메일을 통해 메시지를 발송합니다: {message}")

# SMSSender 구현
class SMSSender(MessageSender):
    def send(self, message):
        print(f"SMS를 통해 메시지를 발송합니다: {message}")

# NotificationManager 클래스
class NotificationManager:
    def __init__(self, sender: MessageSender):
        self.sender = sender

    def notify(self, message):
        self.sender.send(message)

# 의존성 주입 및 사용 예시
if __name__ == "__main__":
    email_sender = EmailSender()
    sms_sender = SMSSender()

    # EmailSender를 사용하는 NotificationManager 인스턴스 생성
    email_notification_manager = NotificationManager(email_sender)
    email_notification_manager.notify("안녕하세요, 이메일 사용자 여러분!")

    # SMSSender를 사용하는 NotificationManager 인스턴스 생성
    sms_notification_manager = NotificationManager(sms_sender)
    sms_notification_manager.notify("안녕하세요, SMS 사용자 여러분!")



위 코드는 생성자 주입(Constructor Injection)을 사용해서 구현한 것입니다.

MessageSender 인터페이스를 가지며, 이를 구현하는 EmailSender 와 SMSSender  클래스가 있습니다.

NotificationManager 클래스는 MessageSender  인스턴스를 생성자를 통해 주입받아 메시지를 발송하는 역할을 합니다.


NotificationManager가 메시지 발송방법 (Email or SMS)에 대해 전혀 알 필요가 없습니다.

발송 방법은 외부에서 NotificationManager에 주입되므로, 결합도가 낮아지고 유연성이 높아집니다.

코드의 재사용성과 테스트 용이성이 향상됩니다.

 

 

 

 

 

참고

https://docs.python.org/3/library/abc.html

 

abc — Abstract Base Classes

Source code: Lib/abc.py This module provides the infrastructure for defining abstract base classes(ABCs) in Python, as outlined in PEP 3119; see the PEP for why this was added to Python. (See also ...

docs.python.org

https://dojang.io/mod/page/view.php?id=2389

 

파이썬 코딩 도장: 36.6 추상 클래스 사용하기

파이썬은 추상 클래스(abstract class)라는 기능을 제공합니다. 추상 클래스는 메서드의 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용합니다. 먼저 추상 클래스

dojang.io

 

728x90