[python] 의존성 주입 패턴

의존성 주입(Dependency Injection)은 객체 간의 의존 관계를 외부에서 정의하고 주입하는 디자인 패턴입니다. 이 패턴은 코드의 유연성과 재사용성을 높여줍니다.

의존성과 의존성 주입

의존성은 한 객체가 다른 객체에 의존하는 상태를 말합니다. 예를 들어, A 객체가 B 객체의 메서드를 사용한다면 A 객체는 B 객체에 대한 의존성을 가지고 있습니다. 이 의존성은 A 객체가 B 객체의 인스턴스를 직접 생성하거나 관리하지 않고, 외부에서 주입받도록 하는 것이 의존성 주입 패턴의 핵심 개념입니다.

의존성 주입의 장점

의존성 주입은 객체의 결합도를 낮추고, 클래스의 재사용성과 유지보수성을 향상시킵니다. 의존성이 외부에서 주입되기 때문에, 특정 객체에 대한 변경이 다른 객체에 영향을 미치지 않습니다. 또한, 모의 객체(Mock Object)를 주입하여 단위 테스트를 수행하는 것이 쉬워지며, 각각의 의존성을 모의 객체로 대체하여 독립된 테스트를 진행할 수 있습니다.

의존성 주입의 유형

의존성 주입은 크게 세 가지 유형으로 나눌 수 있습니다.

  1. 생성자 주입(Constructor Injection): 의존성을 주입받기 위해 생성자를 이용하는 방식입니다. 의존성을 강제로 주입받기 때문에, 해당 의존성이 필수적인 경우에 사용됩니다.

예시:

class A:
    def __init__(self, b):
        self.b = b

b_instance = B()
a_instance = A(b_instance)
  1. 세터 주입(Setter Injection): 의존성을 주입받기 위해 세터 메서드를 이용하는 방식입니다. 의존성이 필수적이지 않은 선택적인 경우에 사용됩니다.

예시:

class A:
    def set_b(self, b):
        self.b = b

b_instance = B()
a_instance = A()
a_instance.set_b(b_instance)
  1. 인터페이스 주입(Interface Injection): 의존성을 주입받기 위해 인터페이스를 이용하는 방식입니다. 일반적으로 의존성 주입 프레임워크에서 사용되는 방식이며, 의존성 주입에 필요한 메서드를 인터페이스로 추상화합니다.

의존성 주입 프레임워크

의존성 주입을 보다 편리하게 사용하기 위해 의존성 주입 프레임워크를 사용할 수 있습니다. 대표적인 예로, Python에서는 injectorDagger와 같은 의존성 주입 프레임워크가 있습니다. 이러한 프레임워크는 객체 간의 의존성을 자동으로 주입해주고, 의존성 주입을 위한 코드를 줄여줍니다.

참고 자료