(Effective Java) 의존 객체 주입(DI), 의존 객체 주입 패턴

2022. 9. 20. 22:31독서

반응형
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
의존 객체 주입 패턴은 아주 단순하여 수많은 프로그래머가 이 방식에 이름이 있다는 사실도 모른 채 사용해왔다.

 

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

 

 

책의 예제를 살펴보자.

 

 

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 Main {
    public static void main(String[] args) {
        String invalidStr = "This is Inavlid Tsring";
        
        boolean result = SpellChecker.isValid(invalidStr);
        
        if (result) {
            System.out.println("INVALID");
        } else {
            System.out.println("VALID");
        }
    }
}

 

 

또 다른 예시를 보자.

 

 

이번에는 싱글턴 예시다.

 

 

public class SpellChecker {
    private final Lexicon dictionary = ...;
    
    private SpellChecker(...) {}
    public static SpellChecker INSTANCE = new SpellChekcer(...);
    
    public boolean isValid(String word) {...}
    
    public List<String> suggestions(String typo) { ... }
}

 

사용하는 방식은 INSTANCE에 접근해서 사용하면 된다.

 

 

위 두 방식의 문제점은 확장에 유연하지 못하고, 테스트하기 어렵다는 것이다.

 

 

테스트하기 어렵다는 것은 이해가 가지만 확장에 유연하지 못하다는 것은 와닿지 않을 수 있다.

 

 

 

🧐 만약 검사에 사용되는 사전이 여러 개라면?

 

지금은 이미 초기화된 하나의 사전에 대해서 사용을 강제하고 있다.

 

 

만약 다른 사전으로 검색하고 싶다면 어떻게 해야 할까?

 

 

사전에 따라서 코드를 수정해야 한다.

 

 

 

이 구조는 아주 확장에 취약한 구조다.

 

 

이럴 때 우리는 의존 객체 주입 패턴을 사용할 수 있다.

 

 

public class SpellChecker {
    private final Lexicon dictionary;
    
    public SpellChekcer(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }
    
    public boolean isValid(String word) {...}
    
    public List<String> suggestions(String typo) {...}
}

 

이런 방식을 사용하면 객체를 호출할 때 

 

 

필요한 사전을 주입하면 되기 때문에 확장에 아주 유연한 구조를 가지게 된다.

 

 

 

🧐 스프링의 DI


눈치가 빠른 분들은 스프링의 DI를 떠올리실 것이다.

 

 

스프링도 이와 비슷한 방식으로 의존성을 주입하고 있다.

 

 

스프링은 컨테이너가 자동으로 bean으로 등록하려면 객체 의존 설정이 되어 있어야 한다.

 

 

스프링의 DI에 대해서 자세하게 아래의 문서에서 설명해놓았으니 참고하면 좋을 것 같다.

 

 

 

(Spring) DI/의존 객체 주입 패턴 + Lombok

🧐 스프링의 DI 스프링의 특징이라고 할 수 있는 DI는 Dependency Injection의 준말이다. 말 그대로 의존성 주입이며, 기본적으로 의존 객체 주입 패턴으로 이루어져 있다. 스프링에서는 bean을 직접 생

mirrorofcode.tistory.com

 

반응형