Study

리소스의 의존성 주입

부산대보금자리 2022. 11. 22. 15:17

대부분의 클래스는 독자적인 자원으로만 제 역할을 다하기 힘든 경우가 많다. 

따라서 클래스간 리소스는 의존하게 되고 이는 의존성으로 프로그램의 복잡도에 영향을 미친다.

여기서의 예제에서는 SpellCheck라는 클래스가 Dictionary를 사용하고 의존성을 가진다고 보자.

 

대표적으로 두 가지 부적절한 구현이 존재한다. 

1) static 클래스의 사용

public class SpellChecker {
    private static final Lexicon dictoary = new KoreanDictionary();

    private SpellChecker(){
        //Noninstatiable
    }

    public static boolean isvalid(String word){
        throw new UnsupportedOperationException();
    }

    public static List<String> suggestions(String type){
        throw new UnsupportedOperationException();
    }

}

 

2) 싱글톤으로 구현

public class SpellChecker {
    private final Lexicon dictoary = new KoreanDictionary();

    private SpellChecker(){
        //Noninstatiable
    }

    public static final SpellChecker INSTANCE = new SpellChecker();

    public static boolean isvalid(String word){
        throw new UnsupportedOperationException();
    }

    public static List<String> suggestions(String type){
        throw new UnsupportedOperationException();
    }

}

위와 같은 경우 코드상으로 어떠한 사전을 쓸것이라는 것이 고정되므로 가변적인 값에 의해 다양한 행동을 하기 힘들다.

즉 위 사전만 사용할수 있으며 다른 사전을 사용하는 Checker를 위해 또 다른 클래스가 필요할수 있다.

이를 위해서 생성자로 사전을 주입하는 방식을 보자.

 


public class SpellChecker {
    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary){
        this.dictionary = Objects.requireNonNull(dictionary);
    }
    public static boolean isvalid(String word){
        throw new UnsupportedOperationException();
    }

    public static List<String> suggestions(String type){
        throw new UnsupportedOperationException();
    }

}

 

요약하자면 의존하는 리소스에 따라 행동을 달리하는 클래스를 만들 때는 싱글톤이나 스태틱 유틸 클래스를 사용하지 말자