소프트웨어 개발자/SW 개발론

[SW 개발] 의존성 주입 (DI, Dependency Injection)

yubi5050 2024. 7. 6. 16:17

DI (Dependency Injection) 란?

하나의 객체가 다른 객체를 필요로 할 때(의존성을 가진다), 객체를 클래스 내부에서 직접 생성하여 사용하지 않고, 외부에서 생성해 놓은 객체를 사용(주입)하여 결합도를 낮추는 것.

 

DI의 장점

  • 결합도 감소: 객체 간의 의존성이 명시적으로 주입되어, 객체들이 직접적으로 결합되지 않아 결합도가 낮아짐.
  • 유연성 및 재사용성 증가: 의존성 주입을 통해 객체의 구성 요소를 쉽게 교체하거나 재사용할 가능
  • 테스트 용이성: 의존성을 외부에서 주입받기 때문에, 모의 객체(Mock Object)나 테스트 더블(Test Double)을 사용하여 단위 테스트를 쉽게 작성 가능
  • 유지 보수성 향상: 의존성이 명확하게 드러나고 관리되므로, 코드의 가독성과 유지보수성 향상

 

Python DI 주입 예시

class Service:
    def perform_action(self):
        print("Action performed")

class Client:
    # 방법 1 - 생성자
    def __init__(self, service: Service):
        self.service = service
    
    # 방법 2 - setter
    def set_service(self, service: Service):
        self.service = service

    def do_work(self):
        self.service.perform_action()


# 방법 1 - 생성자
service = Service()
client = Client(service)
client.do_work()

#  방법 2 - setter 
service = Service()
client = Client()
client.set_service(service)
client.do_work()

 

 

service layer 에서의 DI

비즈니스 로직을 작성하여 service layer로 분리 하곤 하는데, service layer를 잘 분리하면, main 의 코드에서 위의 예시 같이, 결합도를 잘 낮추어 사용 가능하다.