의존 객체 주입은 인스턴스 생성 시 생성자에 필요한 자원을 넘겨주는 방식이다.
싱글턴, 정적 유틸리티 클래스 방식에 비해 아주 단순하며, 유연하고, 테스트에 용이하다.
public class SpellChecker {
// 의존 객체
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = Objects.requireNonNull(dictionary);
}
public boolean isValid(String word) {...}
public List<String> suggestions(String typo) {...}
}
위 코드는 의존 관계와 상관없이 잘 동작한다.
또한 불변 아이템을 보장하여, 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있다.
의존 객체 주입의 변형으로 생성자에 자원 팩터리를 넘겨주는 방식이 있다.
Supplier<T>
인터페이스Supplier<T>
를 입력받는 메서드는 일반적으로 *한정적 와일드카드타입(bounded wildcard type)을 사용해 팩터리의 타입매개변수를 제한해야 한다.Mosaic create(Supplier<? extends Tile> tileFactory) {...}
의존 객체 주입은 코드를 어지럽게 만들 수 있으나, 스프링에서는 Lombok
의 @RequiredArgsConstructor
애너테이션을 통해 보완 가능해 보인다.
*한정적 와일드카드타입
제네릭에서 ?
으로 아직 알려지지 않은 타입, 즉 와일드 카드 타입에 대해 상위 클래스를 지정함으로써 제한을 두는 것
조슈아 블로크Joshua Bloch, 『이펙티브 자바 Effective Java 3/E』, 개앞맵시(이복연) 옮김, 인사이트(2018), p28-30.