객체 내부에서 다른 객체의 메서드를 호출하여 사용하는 것을 의존 한다고 표현한다. 역할과 책임에 따라 객체를 분리하고 각 객체들에게 메시지를 보내 사용자가 원하는 기능을 제공한다. 의존 객체의 메서드를 호출하기 위해서 다음과 같이 사용할 수 있다.

(자세한 코드는 https://github.com/kyukong/jwp-hands-on/tree/di 참고)

정적 참조

필요한 객체를 사용하는 측에서 생성하거나, 정적 참조를 할 수 있다. 여기서 UserDao 는 모든 스레드가 공유하는 정보를 가지고 있어 싱글톤으로 만들기 위해 정적 메서드만을 가지도록 구성하였다.

사용하는 측에서 필요한 객체(클래스) 를 직접 호출한다면 이후에 UserDao 에 변경점이 생겼을 때 수정하기 어렵다. UserDao 를 사용하는 코드를 모두 찾아 예외가 발생하지 않게 올바르게 작성해주어야 한다. 또, UserService 에 대한 테스트를 할 때 UserDao 에 대한 제어를 할 수 없어 테스트하기 어렵다.

생성자 주입

내부에서 직접 호출하는 것이 문제였으므로 사용하는 객체가 생성될 시점에 외부에서 받아오는 방식으로 문제를 해결해볼 수 있다. 의존 객체를 외부에서 받아오도록하여 필요에 따라 의존 객체를 교체할 수 있도록 구성하였다. 하지만 여전히 UserDao 구현체를 받아와야 하므로 테스트에는 어렵다.

인터페이스로 생성자 주입

인터페이스로 기능을 명세하고 구현체를 만듦으로써 결합도를 낮췄다. 상황에 따라 필요한 구현체를 생성하여 테스트가 용이해졌다. 하지만 여전히 실제 프로덕션 코드에서는 어떤 구현체를 사용할지 결정해주어야 한다는 문제가 있다.