본문 바로가기
공부/이펙티브자바

5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하기

by JERO__ 2022. 3. 18.

하나의 자원에 의존

  • 많은 클래스가 하나의 자원에 의존할 때
    • 가령, 맞춤법 검사기는 사전(dictionary)에 의존
    • 정적 유틸리티 클래스로 자주 구현될 수 있음
    • 싱글톤으로 구현하는 경우도 흔함
// 정적 유틸리티 클래스
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 SpellChecker {
    private static final Lexicon dictionary = ...; // 사전 내용

    private SpellChecker( ... ){}  // 객체 생성 방지
    **public static SpellChecker INSTANCE = new SpellChecker( ... );** 
    
    public static boolean isValid(String word) { ... }
    public static List<String> suggestions(String typo) { ... }
}

문제점

  • 사전이 언어별, 특수 어휘용 별로도 두기도 함
  • 테스트용 사전이 필요할 수 있음
  • 사전 하나로 이 모든 쓰임에 대응하기엔 힘듦

해결방법

  • 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식
public class SpellChecker {
    private final Lexicon dictionary; // 사전 내용

    **private SpellChecker(Lexicon dictionary){
        this.dictionary = Objects.requireNonNull(dictionary);
    }**

    public static boolean isValid(String word) { ... }
    public static List<String> suggestions(String typo) { ... }
}
  • 의존 객체 주입이 유연성과 테스트 용이성을 개선해준다.
  • BUT, 의존성이 수천 개 되는 클 프로젝트에서는 코드를 어지럽게 만들기도 한다.
    • Spring, Dagger, Guice 같은 의존 객체 주입 프레임워크 사용시 어질러짐 해소 가능

정리

  • 클래스가 내부적으로 하나 이상의 자원에 의존하며, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋음
  • 이 자원들을 클래스가 직접 만들게 해서도 안됨(생성자로 받기)
  • 유연성, 재사용성, 테스트 용이성을 개선해줌

댓글