THIS IS ELLIE

의존성 주입 Dependency Injection 본문

공부/Unit Testing

의존성 주입 Dependency Injection

Ellie Kim 2023. 5. 8. 01:52

이전 포스트에서 Dependency Injection이
유닛 테스트에 왜 필요한지에 대해 포스팅했다면
오늘은 Dependency Injection이
무엇인지에 대해서 간단히 작성해보려 합니다


그래 Dependency Injection이 도대체 뭔데?
저도 처음 DI를 접했을 때 꽤 많이 혼란스러웠는데요
아직까지도 혼란스러울 수도?
응?

 

Dependency Injection에 대해서 찾아보면
의존관계 주입, 의존성 주입 등등 나오는데
그냥 영어 그대로 받아들여야 이해하기가 더 쉬운 것 같아요
Dependecy를 Inject 한다
???????????

 

그림으로 같이 봐요

 

A 객체 B 객체가 있다고 생각해 봅시다
A 객체 함수 내부에서 B 객체를 생성하면
아래와 같은 모습이 되겠죠

A 객체의 함수 내부에서 B 객체를 생성하지 않고
이 의존 관계를 뒤집어 봅시다

 

A 객체에 준비된 B 객체를 주입해 본다고 생각해 볼게요
그럼 아래와 같은 모습이 되겠죠

네 이게 Dependency Injection입니다

 

 

은 아니고...
이전 포스트에 작성했던 내용을 잠시 들고 와볼게요
(아직 이전 포스트를 보지 않으셨다면 이전 포스트를 읽어보시길 추천드립니다)

 

자 아래 이미지를 보면

클래스 A에 있는 a 함수를 테스트하고 싶었으나
클래스 A에서 클래스 B를 생성해서 b 함수를 호출하기 때문에
클래스 B에 있는 b 함수가 실패하게 된다면
a 함수도 테스트 실패하게 되는 경우입니다

 

그리고 이 문제를 방지하기 위해
우리는 Dependency Injection을 사용합니다
fake, mock, dummy로 보장된? 옳은 결과를 가지는 클래스 B를 만들어
클래스 A에 주입한다고 하면 클래스 A의 a 함수는 다른 코드에 독립적인 거죠
즉 클래스 B의 b 함수는 클래스 A에 있는 a 함수를 테스트에 영향을 끼치지 않는 거죠

 

coupling은 객체들 간에 의존성을 뜻하는데요
Dependency Injection을 통해서
우리는 객체들 간에 의존성을 헐렁하게 만들었죠?
조금 어렵게 표현하면 loose coupling을 갖게 됩니다ㅇㅇ

 

마지막으로 정리할 겸
코드로 다시 볼게요

 

자 이게 원래 모습
A 클래스에서 B 객체 만들고 b 함수를 호출한다

여기서 Dependency Injection을 해보자

 

A 클래스에서 B 객체 만들고 가 아니라
준비된 B 객체를 A에 주입한다고 했죠?

위와 같이 첫 번째 init을 사용해서 주입해 줄 수도 있어요

 

두 번째 프로퍼티를 통해 주입해 줄 수도 있어요

 

생각보다 간단하...죠?
간단...한...가...?

 

반응형