마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

의존성 주입 예시... Dependency Injection

0 추천

안녕하세요

의존성 주입 DI 공부중 이해가 안되는게 있어서 질문합니다...

 // 철광석 클래스
  class IronNugget {
    ...
  }

  // Axe클래스 내부에서 IronNugget 클래스를 생성하여 사용
  class Axe {
      val ironNugget = IronNugget()
    ...
  }
  
  // Shovel 클래스 내부에서 IronNugget 클래스를 생성하여 사용
  class Shovel {
      val ironNugget = IronNugget()
    ...
  }

구글 블로그에 있는 예시입니다.

이렇게 의존성이 생기게 되면 철광석 클래스의 변화가 생기면 의존성을 갖는 모든 클래스가

같이 변경 해야하는 문제가 발생한다고 하는데...

왜 변경을 해야하죠....?? 뭘 변경한다는건지 이해가 잘안갑니다...

철광석 클래스 안에 코드 변화가 생겨도 Axe, Shovel 클래스에서 

IronNugget() 객체를 생성하는 코드는 똑같은거 아닌가요...

dkssudgktpdy (520 포인트) 님이 2022년 4월 19일 질문

1개의 답변

0 추천
 
채택된 답변

말 그대로입니다.  예를 들어, IronNougget의 생성자에 이름을 전달해야하는 상황이 생겼다고 치면, 아래처럼 IronNouget()을 생성하는 모든 코드를 직접 변경해주어야 겠죠? 만약 IronNuigget를 생성하는 곳이 10곳이라면 10곳을 모두 변경햊 주어야 합니다. 사용하는 곳이 많아질 수록 코드 변경애 번거롭고 리스크가 생깁니다.

 class IronNugget(val name: String) {
    ...
  }

  // Axe클래스 내부에서 IronNugget 클래스를 생성하여 사용
  class Axe {
      val ironNugget = IronNugget("IronNougget")
    ...
  }
  
  // Shovel 클래스 내부에서 IronNugget 클래스를 생성하여 사용
  class Shovel {
      val ironNugget = IronNugget("IronNougget")
    ...
  }

 

하지만 DI를 사용할 경우는 DI를 해주는 곳만 변경해 주면 됩니다. 

object IronModule {
     provide fun providesAxe(): Axe {
          return Axe(providesIronNougget());
     }

     provide fun providesShovel(): Shovel {
          return Shovel(providesIronNougget());
     }

     private fun providesIronNougget(): IronNougget {
        return IronNougget("IronNougget")
    }
}

 

다른 예는 IronNougget 클래스 대신에 다른 구현체를 사용할 경우입니다. 앱을 만들다 보면 구현 클래스자체를 아예 바꾸어야 하는 경우도 생깁니다. 이런 경우는 더 문제가 됩니다. 아래와 같이IronNougget가 인터페이스이고 구현 클래스를 교체해야 하는 상황에서도 차이점을 더 명확하게 볼 수 있습니다.

interface IronNuggeInterface 

// 철광석 클래스
  class IronNugget: IronNuggeInterface {
    ...
  }

 class AnotherIconNugget: IronNuggeInterface {
 
}

// 내부에서 직접 생성 - 구현체에 따라 사용하는 클래스에 변경사항이 생김.
  class Axe {
      val ironNugget: IronNuggeInterface = AnotherIconNugget()
    ...
  }

  class Shovel {
      val ironNugget : IronNuggeInterface= AnotherIconNugget()
    ...
  }


//  DI 사용 - 구현체가 바뀌어도 사용하는 클래에는 변경사항이 없음.
  class Axe(val ironNugget: IronNuggeInterface) {

  }

  class Shovel(val ironNugget: IronNuggeInterface) {
  
  }

 

spark (227,530 포인트) 님이 2022년 4월 19일 답변
dkssudgktpdy님이 2022년 4월 19일 채택됨
...