Skip to content

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) 더 모듈화 할 수 있다