Book Record/Effective Java 3E

[Effective Java] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

lakelight 2022. 12. 1. 09:43
728x90
반응형

 

많은 클래스가 하나 이상의 자원에 의존합니다.
이번 시간에는 의존하는 방식에 대해서 고민해보는 시간입니다.

 

1. 정적 유틸리티를 잘못 사용한 예

package twim.corp.grafting.domain.Grafting.service;

public static class DependencyCheck {
    
    private final DependencyLib dependencyLib = new DependencyLib();
    
    private DependencyCheck(){};
    
    public boolean isValid(String dependency){ return true; }
}

2. 싱글턴을 잘못 사용한 예

package twim.corp.grafting.domain.Grafting.service;

public class DependencyCheck {
    
    private final DependencyLib dependencyLib = new DependencyLib();
    
    private DependencyCheck(){};
    public static DependencyCheck INSTANCE = new DependencyCheck();
    
    public boolean isValid(String dependency){ return true; }
}
위에 두 코드는 DependencyLib이 교체될 수 없는 코드입니다. final 한정자를 제거하고 다른 DependencyLib으로 교체하는 메서드를 추가할 수 있겠지만 이 방식은 오류를 내기 쉽고 멀티스레드 환경에서는 쓸 수가 없습니다. 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않은 것입니다. 그렇다면 의존 객체 주입을 통해 이 문제를 해결 할 수 있을 것입니다

3. 의존 객체 주입은 유연성과 테스트 용이성을 높여줄 수 있습니다.

public class DependencyCheck {

    private final DependencyLib dependencyLib;

    // 의존성을 주입하는 부분
    public DependencyCheck(DependencyLib dependencyLib){
        this.dependencyLib = Objects.requireNonNull(dependencyLib);
    };
    
    public boolean isValid(String dependency){ return true; }
}
위의 코드에서 dependencyLib은 의존관계를 주입하면서 유연성을 갖춘 코드로 변경되었습니다. 그리고 객체의 불변을 보장하며, 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있기도 합니다. 의존 객체 주입은 생성자, 정적 팩터리, 빌더 모두 똑같이 응용할 수 있습니다.

 

 

마무리

클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면,
싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋을 것 같습니다.

이 자원들을 클래스가 직접 만들게 해서도 안되고 필요한 자원을 생성자에 넘겨주는 방식으로 해야합니다.

의존 객체 주입 기법은 클래스의 유연성, 재사용성, 테스트 용이성을 기막히게 개선해주는 좋은 방법입니다.

감사합니다.

 

 

[출처]

이펙티브 자바 Effective Java 3/E - 조슈아 블로크 저/ 개앞맵시 

 

728x90
반응형