2장 객체 생성과 파괴 - 의존 객체 주입

정지수 JisooJung·2021년 11월 21일
0

Effective Java 스터디

목록 보기
6/6

아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

의존 객체 주입

의존 객체 주입은 인스턴스 생성 시 생성자에 필요한 자원을 넘겨주는 방식이다.
싱글턴, 정적 유틸리티 클래스 방식에 비해 아주 단순하며, 유연하고, 테스트에 용이하다.

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) {...}
}

위 코드는 의존 관계와 상관없이 잘 동작한다.
또한 불변 아이템을 보장하여, 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있다.

팩터리 메서드 패턴 (Factory Method pattern)

의존 객체 주입의 변형으로 생성자에 자원 팩터리를 넘겨주는 방식이 있다.

  • 자바 8의 Supplier<T> 인터페이스
    Supplier<T>를 입력받는 메서드는 일반적으로 *한정적 와일드카드타입(bounded wildcard type)을 사용해 팩터리의 타입매개변수를 제한해야 한다.
    이를 통해 클라이언트는 자신이 명시한 타입의 하위타입을 생성할 수 있는 팩터리를 넘길 수 있다.
    예시) Mosaic create(Supplier<? extends Tile> tileFactory) {...}

의존 객체 주입은 코드를 어지럽게 만들 수 있으나, 스프링에서는 Lombok@RequiredArgsConstructor 애너테이션을 통해 보완 가능해 보인다.


*한정적 와일드카드타입
제네릭에서 ?으로 아직 알려지지 않은 타입, 즉 와일드 카드 타입에 대해 상위 클래스를 지정함으로써 제한을 두는 것

Reference

조슈아 블로크Joshua Bloch, 『이펙티브 자바 Effective Java 3/E』, 개앞맵시(이복연) 옮김, 인사이트(2018), p28-30.

profile
Study&Work&Log

0개의 댓글