개요

왜 쓰지

커리어의 대부분을 파이썬을 사용하면서, 당연하게도 복잡한 비즈니스 로직을 가지는 애플리케이션을 만들어야 하는 일도 많았습니다. DDD 의 Building Blocks의 일부(흔히 DDD-Lite 라고 부르는)

Dependency Injection 의존성 주입 가 적용된 객체라면, 의존성 관리가 필요합니다. 의존성 관리를 직접 하려면 아마도 다음의 과정을 거치게 됩니다.

import abc

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

class IB(abc.ABC):
    @abc.abstractmethod
    def run(self):
        pass

class B(IB):
    def run(self):
        # runnnnnn

a = A(B())  # 이 부분

한두개야 괜찮겠지만, 의존성이 복잡할 수록 점점 더 귀찮아지고, 그러다보면 실수를 할 가능성도 커집니다. 개인적으로 이 정도 규모의 복잡한 의존성 주입은 자주 경험했습니다.

a = A(C(D(), E(H(), I())), F(G()))

잘못된 의존성을 주입하는 실수는 mypy 같은 타입 검증 도구의 도움을 받으면 해결할 수 있을 것입니다. 그럼 실수로 잘못된 의존성을 주입하는 문제를 해결한 이후의 IoC 컨테이너의 남은 장점은...?

사실 엄밀히 말하자면 마지막 2개는 컨테이너의 장점이라기 보다는 Dependency Injection 의존성 주입Dependency Inversion Principle 의존성 역전 원칙 의 장점이라고 하는 것이 맞겠습니다.

만들어 보자