많은 클래스가 하나 이상의 자원에 의존한다.

예를 들어 맞춤법 검사기는 사전에 의존하는 데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 볼 수 있다.

 

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 final Lexicon dictionary = ...;
    
    private SpellChecker(...){}
    public static SpellChecker INSTANCE = new SpellChecker(...);
    
    public boolean isValid(String word){...}
    public List<String> suggestions(String typo){...}
}

두 방식 모두 사전을 단 하나만 사용한다고 가정한다는 점에서 잘 짜여진 코드라고 볼 수는 없다.

실전에서는 사전이 언어별로 따로 있고 특수 어휘용 사전을 따로 두기도 한다. 

 

SpellChecker가 여러 사전을 사용할 수 있도록 만들어보자.

간단히 dictionary 필드에서 final 한정자를 젝하고 다른 사전으로 메서드를 추가할 수 있지만,

이 방식은 오류를 내기 쉽고 멀티스레드 환경에서는 쓸 수 없다.

사용하는 자언에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다.

 

대신 클래스가 여러 자원 인스턴스를 지원해야하며, 클라이언트가 원하는 자원을 사용해야한다.

이 조건을 만족하는 간단한 패턴은 바로, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다.

이는 의존 객체 주입의 한 형태로, 맞춤법 검사기를 생성할 때 의존객체인 사전을 주입해 주면 된다.

 

public class SpellChecker{
	private final Lexicon dictionary;
    
    public SpellChecker(Lexicon dictionary){
    	
    }
}

 

 

참고 : 책, 이펙티브 자바 3/E

+ Recent posts