개발 공부 기록하기/01. JAVA & Kotlin

짧은 코멘트와 함께하는 이펙티브 자바) #5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

lannstark 2020. 9. 21. 12:00

짧은 코멘트

  1. 의존성 주입은 정말 중요한 개념으로, 스프링을 사용하는 개발자라면 누구나 의존성 주입을 활용하고 있다.
  2. 의존성을 주입을 적절하게 함으로써, 하위 구현체를 갈아 끼울 수가 있고 테스트도 아름답게 작성할 수가 있는데... 의존성은 나중에 찐하게 한 번 다뤄봐야 겠다 ㅎㅎ

 

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

사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않다

예를 들어, 맞춤법 검사기가(SpellChecker) 안에 어휘사전(Lexicon)을 가지고 있다고 하자

정적 유틸리티 클래스로 구현

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 final Lexicon dictionary = ...;
  
  private SpellChecker(...) {}
  
  public static SpellChecker INSTANCE = new SpellChecker(...);
  
  public boolean isValid(String word) { ... }
  
  public List<String> suggestions(String typo) { ... }
}

SpellChecker는 클라이언트가 원하는 자원(Lexicon)을 사용해야 한다. 이럴 때는 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용하는 것이 좋다. 의존 객체 주입을 사용하는 것이다

public class SpellChecker {
  private final Lexicon dictionary;
  
  public SpellChecker(Lexicon dictionary) {
    this.dictionary = Objects.requireNonNull(dictionary);
  }
  
  public boolean isValid(String word) { ... }
  
  public List<String> suggestions(String typo) { ... }
}

이 패턴의 변형으로, 생성자에 자원 팩토리를 넘겨주는 방식이 있다. JAVA 8에서 소개된 Supplier<T> 인터페이스가 팩토리를 표현한 완벽한 예이다.

의존성이 수천 개나 되는 큰 프로젝트에서는 코드를 의존 객체 주입 패턴이 코드를 어지럽게 만들 수도 있다. 이럴 때는 Spring과 같은 의존성 객체 주입 프레임워크를 사용하면 어질러짐을 해결할 수 있다