Dependency injection
번역하면 의존성 주입
이라는 뜻이다.
의존성
사전적 정의로는 다른 것에 의지하여 생활하거나 존재하는 성질.
예를 들면 철수가 영희에게 너 뭐먹을래? 라고 물었는데
영희는 나는 너 먹는거
라고 대답한 상황에서 영희는 철수에게 의존성이 있는 것이다.
의존성 주입
그러면 왜 주입이라는 단어를 사용할까?
의존성 주입이 안된 예시
go
type Younghee struct {
chulsoo *Chulsoo
}
func NewYounghee() *Younghee {
return &Younghee{
chulsoo: &Chulsoo{}, // 직접 만든다! (강한 결합)
}
}
영희
를 생성하는 내부에서철수
를 직접 생성하면서 강한 철수와 영희는 강한 결합을 지니고 있습니다
의존성 주입 예시
go
type Younghee struct {
chulsoo *Chulsoo
}
// 외부에서 철수를 주입 받는다.
func NewYounghee(c *Chulsoo) *Younghee {
return &Younghee{
chulsoo: c,
}
}
영희
는철수
를 내부에서 생성하지 않고 파라미터로 받으면서 외부에서주입
받는 형태가 되었습니다.
의존성 주입, 왜 사용할까?
그럼 왜 내부에서 의존성을 직접 생성하지 않고 외부에서 주입 받을까?
유연성 증가
- 의존하는 객체를 내부에서 만들면 의존관계가 강하게 결합됩니다.
- 주입받으면 필요한 객체를 바꿀 수 있어서 기능 변경이나 확장이 쉽습니다.
- 예를 들어 영희가 철수가 아닌 미진이로 쉽게 바꿀 수 있는 것.
테스트 용이성
- 내부에서 의존객체를 생성할 경우
테스트
가 어렵습니다 - 의존성을 주입 받으면
Mock
객체를 생성하여 테스트가 쉬워집니다.- A를 테스트하고 싶은데 A가 B를 필요할 경우 B는 테스트용 더미 객체를 사용할 수 있다.
결합도 감소
- 의존성을 직접 만들면 객체가 강하게 결합되어 변경 시 큰 영향을 줄 수 있다
- 의존성 주입은 결합도를 낮춰(Loose coupling) 더 모듈화 할 수 있다