본문 바로가기
책 정리/이펙티브 자바

[이펙티브 자바] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - item 5

by chanwoodev 2023. 6. 20.

특정 자원에 의존하는 클래스라면?

 

사용하는 자원에 따라 동작이 달라지는 클래스에 적합하지 않은 방식

 

1. 정적 유틸리티 클래스

public class SpellChecker {
    private static final Lexicon dictionary = ...;

    private SpellChecker() {}
    ..
}

2. 싱글턴 클래스

public class SpellChecker {
    private static SpellChecker INSTANCE = new SpellChecker(,,,);

    private final Lexicon dictionary = ,,,;
}

위와 같은 상황에서 클라이언트의 용도에 맞는 사전을 적용하는 것은 불가능

 

만약 final 키워드를 제거한다면?

  • 멀티스레드 상황에서 사용할 수 없으며 오류를 내기 쉽다.

 

인스턴스 생성시 생성자에 필요한 자원을 넘겨주는 방식 (의존 객체 주입)

public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionalry) {
    	this.dictionary = Objects.requireNonNull(dictionary);
    }
    
    // methods...
}
  • 자원이 몇 개든 의존 관계가 어떻든 잘 작동함
  • 불변을 보장하여 여러 클라이언트가 의존 객체를 안심하고 공유 
  • 의존객체 주입에 다양한 방식 (생성자, 정적 팩토리, 빌더) 응용 가능

의존성이 수천 개나 되는 큰 프로젝트에는 의존 객체 주입 프레임워크를 사용하는게 좋음

 

팩토리 메서드를 넘기는 방식

의존 객체를 여럿 생성해야하는 경우 팩토리 메서드 자체를 넘겨 활용할 수도 있음

 

ex) 타일들로 구성된 모자이크를 만드는 메서드

Mosaic create(Supplier<? extends Tile> tileFactory) {...}

참고: Consumer / Supplier