☕️ JAVA/Effective JAVA

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

1HOON 2022. 1. 2. 15:35

 

아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라


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

아래 SpecllChecker는 사전(dictionary)에 의존하고 있는데, 아래처럼 구현하는 경우를 많이 볼 수 있습니다.

 

정적 유틸리티

public class SpellChecker {
	private static final Lexicon dictionary = new LexiconDictionary();

	private static boolean isValid(String word) { ... }
	private SpeckChecker() { } // 객체 생성 방지
}

싱글턴

public class SpellChecker {
	private final Lexicon dictionary = new LexiconDictionary();

	public static SpellChecker INSTANCE = new SpellChecker(...);
	private SpellChecker(...) { }

	public boolean isValid(String word) { ... }
}

 

위와 같은 경우 사전(dictionary)이 하나로 고정이 되기 때문에 좋은 방법이 아닙니다.

SpellChecker가 여러 종류의 사전을 사용할 수 있도록 하려면 final을 제거하고 dictionary를 변경하는 메서드를 추가할 수 있지만, 오류를 내기 쉬우며 멀티스레드 환경에서는 쓸 수 없습니다.

대신 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주도록 하면 됩니다.

 

의존 객체 주입

public class SpellChecker {
	private final Lexicon dictionary;

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

	public boolean isValid(String word) { ... }
}
  • 자원이 몇 개든 의존 관계가 어떻든 상관없이 작동합니다.
  • 불변을 보장하여 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있습니다.

 

의존 객체 주입은 유연성과 재사용성, 테스트 용이성을 개선해주기는 하지만, 의존성이 많아질 수록 코드가 어지러워집니다.

다행히 스프링과 같은 의존 객체 주입 프레임워크에서 이를 해소해주고 있습니다.

 

 

Reference


 

이펙티브 자바 3/E - 교보문고

프로그래밍인사이트 | 자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브러리의 최신 기능을 십분 활용

www.kyobobook.co.kr

반응형