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

1 분 소요

Summary

  • 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다.
    • 싱글턴과 정적 유틸리티 클래스는 의존 자원을 내부에서 직접 만들기 때문에 이를 갈아 끼우기가 쉽지 않기 때문 (코드가 어색하거나, 오류를 내기 쉽거나, 멀티스레드 환경에서 쓸 수 없음)
    • 대신 ‘의존 객체 주입 패턴’을 사용하라!
  • 의존 객체 주입 패턴
    • 용어는 생소하지만 코드를 보면 심플하다.
      public class SpellChecker {
        private final Lexicon dictionary; // 의존하는 자원
        public SpellChecker(Lexicon dictionary) { // 생성자를 통해 의존하는 자원을 ‘주입’ 받음. 자원을 직접 주입 받지 않고 자원을 만들어주는 팩터리를 넘겨받을 수도 있음
            this.dictionary = Objects.requireNonNull(dictionary);
        }
      }
      
    • 장점
      • ‘불변’ 보장
      • 같은 자원을 사용하는 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있음
      • 유연성 개선 (위 코드에서는 Lexicon을 구현한 어떤 사전이든 주입할 수 있다)
      • 재사용성 개선 (의존 객체만 갈아 끼우는 것 만으로도 똑같은 소스를 재사용할 수 있다)
      • 테스트 용이성 개선 (의존 객체를 mock으로 주입해서 테스트할 수 있다)
    • 의존성이 수 천개나 되는 큰 프로젝트에서는 의존 객체 주입 프레임워크를 사용하자 (Dagger, Guice, Spring 등)

Comment

  • 의존 객체 주입 패턴은 간단하지만 정말 중요한 패턴인 것 같다. 유연성, 재사용성, 테스트 용이성이라는 장점으로 내 시간을 아껴주고 나를 칼퇴근하게 해주고, 예상치 못한 오류 때문에 새벽에 전화오는 것을 막아주기 때문이다. Spring 이라는 프레임워크가 나오고, 지금까지 널리 사용되는 것을 보면 그 중요성을 실감하게 된다.
  • 외부 자원은 내부에서 만들지 않고 외부로부터 주입받는다 라는 지침을 기억해야 겠다.

댓글남기기