아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 #18
-
의존 객체 주입의 잘못된 예 💥
public class SpellChecker {
private static final Lexicon dictionary = ...;
private SpellChecker() {} // 객체 생성 방지
public static boolean isValid(String word) { ... }
public static List<Sring> 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) { ... }
} 그렇다면 궁금증이 생긴다. 대체 왜 테스트하기 어려운 것인가
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments
-
아이템 4번을 읽으면서 생겼던 궁금증들이 많이 해소가 되네요👍
mockito-inline 이라는게 있는지 처음 알았네요! |
Beta Was this translation helpful? Give feedback.
-
해당 정리에서 의존 객체 주입을 보면 OOP 5원칙 중 OCP, DIP가 떠올랐습니다.
public class A {
private C c = new C();
}
// 변경
public class A {
private D d = new D();
} 확장을 하려면 코드를 변경해야하는게 아닌가? 했지만 다형성을 이용하여 의존 주입을 이용하면 가능할 수 있다는 것을 알게 되었습니다. public Class A {
private I i;
public A(I i) {
this.i = i;
}
} 위 처럼 생성자를 통해 의존 주입을 할 수 있다면 클라이언트 코드에서 만 주입할 코드만 변경해준다면 서버 코드를 수정할 필요가 없게 됩니다. (클래스 A를 서버 코드 라고 하면)
하지만 클라이언트 코드 입장에서 변경은?? public class client {
private A a = new A(new B());
// 변경
private A a = new A(new D());
} 어떻게 보면 이것 또한 OCP를 지키지 못하고 그리고 결국 B, D가 있으니 구현 클래스를 직접 선택하는 즉 DIP를 지키지 못하게 되었습니다. 이 두 원칙을 지키는게 참 힘들다고 느껴졌고 이 부분을 지키기 위해 Spring framework에서는 DI(의존 관계 주입), IOC(제어의 역전) 을 통해 해결한 것으로 알 고 있습니다. 따라서 추후 이부분에 대해서도 같이 알아보면 좋을 것 같습니다. 정리 감사합니다. |
Beta Was this translation helpful? Give feedback.
해당 정리에서 의존 객체 주입을 보면 OOP 5원칙 중 OCP, DIP가 떠올랐습니다.
처음 이 원칙이 말이 안된다고 생각했었습니다.
확장을 하려면 코드를 변경해야하는게 아닌가? 했지만 다형성을 이용하여 의존 주입을 이용하면 가능할 수 있다는 것을 알게 되었습니다.
위 처럼 생성자를 통해 의존 주입을 할 수 있다면 클라이언트 코드에서 만 주입할 코드만 변경해준다면 서버 코드를 수정할 필요가 없게 됩니다. (클래스 A를 서버 코드 라고 하면)
따라서 서버 코드에서는 OCP를 지킬 수 있게 됩니다.
또한 이렇게 변경하는 코드를 주입하게 해주는 것이 다형성이고 이러한 특성을 잘 설명한 것이 DIP인 것 같습니다.
하지만 클라이언트 코드 입장에서 변경은??