아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
2021-04-25 00:00:00 # Effective_Java
  • 많은 클래스가 하나 이상의 자원에 의존한다. (적게 의존할수록 좋겠지만 현실의 프로그램은 그렇지 않다는 얘기인 것 같다.)
  • 사용하는 자원에 따라 동작이 달라지는 클래스에는..
    • 정적 유틸리티 클래스는 적합하지 않다.
    • 싱글턴 방식도 적합하지 않다.

인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Objects;

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) {}
}
  • 위의 예시에서 dictionary 객체를 생성자에서 의존성 주입을 했다는 것을 볼 수 있다.
  • 생성자, 정적 팩터리, 빌더에 모두 똑같이 응용 가능하다.
  • 더 응용한 방식으로 생성자에 자원 팩터리를 넘겨주는 방식이 있다. 팩터리 메서드 패턴 (너무 유명한 디자인 패턴!)

결론

  • 물론 의존성 주입을 코드 상에서 직접 해주는 방법이 나쁜 것은 아니지만 너무 많은 의존성 주입이 필요하게 되면 코드가 복잡해진다.
  • Dagger, Guice, Spring에서 프레임워크를 이용해 의존성 주입을 대신 맡기자
  • 클래스의 유연성, 재사용성, 테스트 용이성을 많이 개선 해준다.