의존성 주입

2021-08-12
Architecture

안녕하세요. 도미닉입니다.

오늘은 의존성 주입에 대해서 알아보겠습니다.

우선 의존성이 무엇인지에 대해 정리해보겠습니다.

의존성이란?

위 코드와 같이 Programmer 구조체에서 startProgramming 함수가 호출되기 위해서는 Coffee 구조체가 필요합니다.

이 때 Programmer 구조체는 ‘Coffee 객체에 의존성을 가진다’라고 합니다.

위 예제에서 Coffee 구조체의 drink 메소드가 없어지거나 drink 메소드의 내용이 바뀌면 그에 따라 Programmer 의 startProgramming 메소드가 변경되어야 합니다.

이럴 때 코드의 재활용성이 떨어지고 결합도가 올라가게 됩니다.

아래에서 의존성 뒤에 붙는 주입이라는 단어에 대해서 알아보겠습니다.

주입이란?

위에 코드를 보시면 Coffee 객체를 외부에서 생성해서 Programmer 객체가 생성될 때 넣어주고 있습니다.

객체를 외부에서 넣어주는 것을 주입이라고 합니다.

이렇게 주입만으로 의존성이 줄어들었다고 할 수 있을까요?

첫 예제 코드와 똑같이 Coffee 객체의 drink 메소드가 변경되거나 제거되면 Programmer 의 startProgramming 메소드는 영향을 받을 것입니다.

주입만으로는 아직 Programmer 객체의 Coffee 객체에 대한 의존성을 줄였다고 할 수 없습니다.

의존성 주입이란?

의존성 주입은 의존성을 분리시켜 사용합니다

위에 우리가 작성했던 코드들은 상위 계층(Programmer)이 하위 계층(Coffee) 에 의존하게 되는 상황이었습니다.

의존성 역전의 원칙을 사용해서 상위 계층인 Programmer가 하위 계층인 Coffee 로부터 독립하도록 변경해보겠습니다.

기존에는 Coffee 객체에 drink 가 없다면 Programmer 객체에서 오류 메시지가 발견됬을 것입니다.

이제 Coffee 프로토콜을 채택한 Americano 에 drink 메소드가 없다면 Americano를 선언할 때 에러가 발생하게 됩니다.

제어의 주체가 Programmer 에 있는 것이 아니라 Protocol(Coffee) 에게 있습니다.

에러 발생 시 Coffee 프로토콜만 파악하면 되니 분석이 수월해집니다.

이렇게 의존성이 분리되어 분석이 쉬워지는 것 말고도 의존성을 주입했을 때 아래와 같은 장점들이 있습니다.

의존성 주입의 장점

  • 코드의 재사용성을 높여준다.
  • Unit Test가 용이해진다.
  • 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다.
  • 객체 간의 결합도가 낮아지면서 유연한 코드를 작성할 수 있다.
  • 코드가 단순화된다.
  • 코드를 읽기 쉬워진다.

정리

의존성 주입은 모바일 개발에서 필수적인 요소인 것 같습니다.

저도 이번 기회에 확실히 정리하고 넘어갈 수 있었습니다.

글 읽어주셔서 감사합니다.

참고

https://velog.io/@wlsdud2194/what-is-di
https://medium.com/@jang.wangsu/di-dependency-injection-%EC%9D%B4%EB%9E%80-1b12fdefec4f