하나의 자원에 의존
- 많은 클래스가 하나의 자원에 의존할 때
- 가령, 맞춤법 검사기는 사전(dictionary)에 의존
- 정적 유틸리티 클래스로 자주 구현될 수 있음
- 싱글톤으로 구현하는 경우도 흔함
// 정적 유틸리티 클래스
public class SpellChecker {
private static final Lexicon dictionary = ...; // 사전 내용
private SpellChecker(){} // 객체 생성 방지
public static boolean isValid(String word) { ... }
public static List<String> suggestions(String typo) { ... }
}
// 싱글톤 클래스
public class SpellChecker {
private static final Lexicon dictionary = ...; // 사전 내용
private SpellChecker( ... ){} // 객체 생성 방지
**public static SpellChecker INSTANCE = new SpellChecker( ... );**
public static boolean isValid(String word) { ... }
public static List<String> suggestions(String typo) { ... }
}
문제점
- 사전이 언어별, 특수 어휘용 별로도 두기도 함
- 테스트용 사전이 필요할 수 있음
- 사전 하나로 이 모든 쓰임에 대응하기엔 힘듦
해결방법
- 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식
public class SpellChecker {
private final Lexicon dictionary; // 사전 내용
**private SpellChecker(Lexicon dictionary){
this.dictionary = Objects.requireNonNull(dictionary);
}**
public static boolean isValid(String word) { ... }
public static List<String> suggestions(String typo) { ... }
}
- 의존 객체 주입이 유연성과 테스트 용이성을 개선해준다.
- BUT, 의존성이 수천 개 되는 클 프로젝트에서는 코드를 어지럽게 만들기도 한다.
- Spring, Dagger, Guice 같은 의존 객체 주입 프레임워크 사용시 어질러짐 해소 가능
정리
- 클래스가 내부적으로 하나 이상의 자원에 의존하며, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋음
- 이 자원들을 클래스가 직접 만들게 해서도 안됨(생성자로 받기)
- 유연성, 재사용성, 테스트 용이성을 개선해줌
댓글