(Effective Java 3/E) 108. Item 5 - Prefer dependency injection to hardwiring resources

Prefer dependency injection to hardwiring resources

  • 2판 제목 : 없음
  • 3판 제목 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.

참고 이펙티브 자바 3판에서 추가된 아이템 중 처음으로 2판과 중복되지않는 아이템이다.

많은 클래스들이 하나 이상의 자원에 의존하는 경우가 많다.

가령 어떤 자원을 하나 참좌는 유틸리티 계열 클래스가 있다고 할 때, 우리는 유틸리티를 사용하며 어느정도 균일한 동작을 기대할 것이다.

이때 사용하는 자원에 따라 동작이 달라지는 경우엔 잘못된 구현일 것이다.

바꾸어말해, 사용하는 자원에 따라서 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴은 잘못된 디자인이다.

하지만 어떤 클래스가 여러 자원의 인스턴스를 지원해야하며, 특별히 원하는 자원이 있어서 사용해야한다면

클래스의 인스턴스를 생성할 때 필요한 자원을 넘겨주는 간단한 패턴으로 해결할 수 있다.

우리는 이러한 패턴을 의존성 주입(dependency injection) 이라고 부른다.

이 패턴을 응용하여 생성자에 자원의 팩토리를 넘겨주는 방식인 팩토리 메서드 패턴(Factory Method Pattern) 을 구현할 수도 있다.

자바 8의 Supplier<T> 인터페이스가 완벽한예시이다.

Supplier<T>를 입력으로 받는 메서드는 일반적으로 한정적 와일드카드 타입(bounded wildcard type) 을 사용해 팩토리의 타입 매개변수를 제한해야 한다.

이를 통해 명시한 타입의 하위 타입이라면 무엇이든 생성할 수 있는 팩토리를 넘길 수 있게된다.

의존성 주입이 객체를 보다 유연하게 만들어주고 테스트 용이성을 높여주긴 하지만 의존성이 너무 많은 프로젝트에서는 코드를 오히려 어지럽게 할 수도 있다.

이를 간결하게 하기 위한 의존성 주입 도구들이 있으니 응용해서 사용하면 된다.