5. hard writting작업시 의존선 주입(DEPENDENCY INCECTION) 추천
많은 클래스들이 기본자원에 의존한다. 아래와 같이 사용할 경우에 유연하지 않고 테스트가 불가능하다.
Static Utility
public class SpellCheker {
private static final Lexion dictonary = ... ;
private SpellChecker() {}
public static boolean isValid(Stirng word) {}
}
Singlton
public class SpellCheker {
private static final Lexion dictonary = ... ;
private SpellChecker() {}
public static INSTANCE = new SpecllChecker(...);
public static boolean isValid(Stirng word) {}
}
위의 경우에 SpellChecker가 dictionary를 변경할 수 있을 경우, 동시성 문제등 아주 심각한 문제를 유발 할 수 있다.
Static Utility클래스와 싱글톤은 기본 자원에 의해 매개 변수화 되기에 적합하지 않다 이런 문제를 해결하기 위한 간단한 방법은 새 인스턴스를 만들 때 리소스를 생성자로 전달하는 것 입니다.( Dependency Injection )
dictonary는 spell checker의 의존성이며, 생성시에 spell checker에 주입됩니다
public class SpellCheker {
private static final Lexion dictonary;
private SpellChecker() {}
public static INSTANCE = new SpecllChecker(Lexion dictonary) {
this.dictonary = Objects.requireNonNull(dictionary);
}
public static boolean isValid(Stirng word) {}
}
DI를 적용하는 방법
- Constructor
- Static Factory
- Builders
Dependency Injection 패턴의 유용한 변형은 리소스 팩토리를 생성자에 전달하는 것입니다.
java8의 Supplier
client provided factory을 사용하여 각 tile을 만드는 방법이다 Mosaic create(Supplier<? extends Tile> tileFactory) { … }
DI가 유연성과 테스트 기능을 향상시켰지만, 대형 프로젝트를 어수선하게 할 수 있기 때문에 framework를 이용하는것이 좋습니다 Java 에서 DI framework 로는
- Dagger by google
- Guice by google
- Spring
가 있습니다.
Comments