junome

의존성은 정체를 밝혀라!

의존성 주입

의존성

  • 서로 다른 객체 사이에 의존 관계가 있다는 것
  • 의존하는 객체가 수정되면 다른 객체도 영향을 줄 수 있다.

주입

  • 외부에서 객체를 생성하여 넣는 것을 말한다.
  • 외부에서 객체를 주입하기 위해 생성자 등을 사용한다.

의존성 주입

  • DI 라고도 한다.
  • 의존성으로 다른 객체에 영향을 주는 것은 어떤 수정사항이 있을 때 매번 다른 객체를 수정해주어야 한다.
  • 의존성을 가진 코드가 많다면 재활용성이 떨어지고, 의존성을 가지는 객체들과 함께 수정해야하는 문제가 생긴다.

정리: 의존성 주입을 통해서 객체를 수정하더라도 알아서 따라오는 의존 관계를 만들 수 있다.

의존성 관계 역전 법칙

스크린샷 2023-11-17 오전 10 14 46

DIP는 OOP의 다섯가지 원칙 중 하나인 SOLID 중 하나입니다.

DIP는 고수준 모듈이 저수준 모듈에 의존하는 전통적인 의존관계를 반전시킴으로써 고수준 모듈이 저수준 모듈의 구현으로 부터 독립될 수 있는 구조를 말합니다.

고수준 모듈은 저수준 모둘의 구현에 의존해서는 안 됩니다. 둘다 추상화에 의존해야 합니다.

ex) 추상화는 세부사항에 의존해서는 안되지만 세부사항은 추상화에 의존해야한다.

아이는 장난감만 알면 되지 세부적인 로봇, 모형 자동차, 레고를 모두 알 필요 없이 장남감으로 인해서 아이는 로봇, 모형 자동차, 레고를 알게 된다.

의존성 주입의 코드 예시

class User {
     var game = Game()

     func startGame() {
            self.game.start()
    }
}

위 코드에서 User와 Game 사이 결합도가 증가하고 의존성이 생깁니다.

의존성은 왜 생기면 안될까?

  • Game을 바꾸면 Game과 startGame의 결합된 모든 것을 바꾸어야함
  • 코드의 재사용성이 떨어짐
  • 이게 DIP 의존성 역전 법칙의 위배됩니다.
  • DIP를 위배하지 않으려면 의존 시 클래스 보다는 인터페이스 혹은 추상 클래스와 관계를 맺어야합니다.

의존성 주입을 하면 이점이 무엇일까?

  • 코드의 재사용성이 높아집니다
  • 테스트가 편리해집니다.
  • 코드의 유연성이 크게 증가합니다.
  • 코드 분석 및 파악 용이