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
반응형
'Book Record > Effective Java 3E' 카테고리의 다른 글
[Effective Java] 다 쓴 객체 참조를 해제하라 (1) | 2022.12.01 |
---|---|
[Effective Java] 불필요한 객체 생성을 피하라 (0) | 2022.12.01 |
[Effective Java] private 생성자나 열거타입으로 싱글턴임을 보증하라 (2) | 2022.12.01 |
[Effective Java] 생성자에 매개변수가 많다면 빌더를 고려하라 (2) | 2022.11.30 |
[Effective Java] 생성자 대신 정적 팩터리 메서드를 고려하라 (2) | 2022.11.30 |