공부/디자인 패턴

[디자인패턴] 의존성 주입이란?

감자 바보 2023. 3. 12. 18:24
반응형

[디자인패턴] 의존성 주입이란?

 이번 게시글에서는 의존성 주입 (Dependency Injection)이란 무엇인지 예시를 통해 설명할 겁니다. 예시가 옳지 않거나 제가 틀린 부분이 있을 시 피드백 주시면 빠르게 반영하도록 하겠습니다.

 

의존성 주입(Dependency Injection)이란?

 의존성 주입(Dependency Injection)이란 컴포넌트 간 의존성을 낮추기 위해 인스턴스 생성을 클래스 외부로 위임하는 디자인 패턴 중 하나입니다. 

 

 자바나 코틀린 등 객체 지향 프로그래밍 언어에서 클래스 간 의존성이 존재한다는 건, 한 클래스의 변화로 인해 다른 클래스에 영향을 주는 것을 의미합니다.  

 

 의존성 주입을 사용하여 프로젝트를 구성한다면 보일러 플레이트를 줄일 수 있고, 추가로 유지보수에 여러 이점이 존재한다고 합니다.


의존성이 있는 경우

 자동차 회사 H사가 있다고 합시다. H사는 전기차를 생산하며 전기차 모델 i가 존재합니다. 각 모델들을 만드는 공장 I1, I2, I3, I4 등이 존재하며, 전기차에 필요한 배터리를 각 공장에서 관리한다고 생각해 봅시다. 

 

  기존에는 공장들은 기존에 S 배터리를 사용했습니다. 각 공장들은  S 배터리에 주문을 넣게 됩니다.

 추후에 H사는 다음 전기차 모델에서 배터리를 S사 배터리에서 L 배터리를 교체합니다. 이에 따라 각 공장들은 L 배터리 회사에 배터리를 새로 주문을 하게 됩니다. 하지만 I1 ~ I3 공장들은 정상적으로 주문을 성공하게 되었지만, I4 공장은 기존 주문 담당자 퇴사로 인한 업무공백으로 배터리를 변경하지 못했습니다. 그에 따라 S사 배터리가 그대로 사용된 불량품이 I4 공장에서 출고될 겁니다.

 

 

 위 예시를 프로그래밍 과정으로 변환해보면, 공장 클래스는 배터리 클래스의 인스턴스를 직접 생성한다면 의존성이 존재한다고 할 수 있습니다. 배터리 클래스의 변경사항이 생긴다면, 모든 공장 클래스는 이를 반영해야 합니다. 이때, 배터리 클래스를 제대로 변경하지 않은 부분이 존재한다면 위 예시와 같이 비정상 동작이 발생할 겁니다.


 그렇다면 의존성 주입을 통해 인스턴스 생성을 외부로 위임하는 예시에 대해 알아봅시다. 만약 H사가 각 공장이 배터리를 주문 및 관리 하는 것이 아닌 H사 본사에서 일괄 주문하고 이를 각 공장에 전달하는 형태였다면 어땠을까요?

 

 기존의 S사 배터리를 사용할 때에는 아래와 같은 형태일 것입니다.

 각 공장들은 H사 본사의 재고 관리 부서에 배터리를 요청합니다. 재고 관리 부서는 필요한 배터리를 배터리 회사에 일괄 주문합니다. 앞선 예시와 같이 새 모델 출시에 따라 배터리를 S사의 배터리에서 L사에 배터리로 변경하게 된다고 합시다. 아래와 같은 그림이 되게 될 겁니다.

 

 재고 관리 부서에서 배터리 변경을 제대로 수행한다면, 각 공장들은 배터리의 변경에 따라 추가 처리를 하지 않아도 됩니다. 더해서, 각 공장들은 배터리 회사와 연락하던 인력을 줄이거나 다른 임무로 대체하도록 할 수 있을 겁니다.

 

 의존성 주입을 사용한다면 코드 변경에 따른 작업 분량이 줄어들어 실수를 줄이고, 추가적인 이점으로 의존성 인스턴트들을 관리하는데 필요한 리소스들을 줄일 수 있다는 장점이 존재합니다.

 

마무리

 의존성 주입이란 디자인패턴이 무엇이고 이를 간단하게 이해하기 위해 예시를 만들어서 설명해보았습니다. 의존성 주입에 대해 처음 공부하기 때문에 틀린 부분이 많고 예시도 적절치 못할 수 있습니다. 읽어보시고 부족한 부분 피드백 해주시면 빠른 시일내로 반영할 수 있도록 노력하겠습니다. 편하게 피드백 해주세요! 

 

참고

1. hilt android 공식문서, https://developer.android.com/training/dependency-injection/hilt-android?hl=ko 

2. HYPERCONNECT 기술 블로그 - Eum Jaewoong, "Dagger Hilt로 안드로이드 의존성 주입 시작하기", https://hyperconnect.github.io/2020/07/28/android-dagger-hilt.html, accessed by 2023.03.12.