의존성이란 모듈 간의 연결이다.
클래스 A가 다른 클래스 B를 사용할 때 A는 B에 의존한다고 한다. 때문에 B가 변화하면 A에 영향을 미친다.
위 예시에서 memberController 클래스는 memberService 클래스를 사용하기 때문에 이에 의존한다고 말할 수 있다. memberService와 memberRepository도 마찬가지이다.
즉, 한 객체의 코드에서 다른 객체를 생성하거나 다른 객체의 메서드를 호출하거나 파라미터로 다른 객체를 전달받아 사용할 때 의존성이 발생한다.
과한 의존은 모듈의 재사용과 유닛 테스트 작성을 어렵게 한다. 이러한 문제를 해결하기 위해 의존성 주입(DI)이라는 패턴을 사용할 수 있는데, 의존성 주입은 외부에서 객체 간 의존 관계를 주입해 주는 방식이다. 필요한 객체를 직접 생성하거나 찾는 방식이 아닌, 외부에서 넣어주는 방식이다.
의존성 주입을 사용하는 이유는 다음과 같다.