본문 바로가기

Dev Book/Effective Java

[Effective Java] item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

1. 유연하지 않고 테스트하기 어렵다.

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

해결방안 : 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식 = 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다.

 

 

2. 유연성과 테스트 용이성을 높여준다.

의존 객체 주의 패턴 : 생성자에 필요한 자원을 넘겨주는 방식

  • 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 작동한다.
  • 불변(아이템 17)을 보장하여 (같은 자원을 사용하려는) 여러 클라이언트가 의존 객체들을 안심하고 공유할 수 있다.
    • 아이템 17) 클래스를 불변으로 만드는 다섯 가지 규칙
    • 1. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
    • 2. 클래스를 확장할 수 없도록 한다.
    • 3. 모든 필드를 final로 선언한다.
    • 4. 모든 필드를 private으로 선언한다.
    • 5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
  • 의존 객체 주입은 생성자, 정적 팩터리(아이템 1), 빌더(아이템 2) 모두에 똑같이 응용할 수 있다.

생성자에 자원 팩터리를 넘겨주는 방식으로 변형

 

팩터리란? 호출할 때마다 특정 타입의 인스턴스를 반복해서 만들어주는 객체 - 팩터리 메서드 패턴(Factory Method pattern)

Supplier< T > 인터페이스 = 팩터리

 

[관련 코드] :https://github.com/2Smean/ReadingBook/blob/main/src/main/java/Chap2_GenerateObjectAndDestory/item5/usecase3/SpellChecker.java

 

3. 의존 객체 주입 프레임워크

클래스의 유연성, 재사용성, 테스트 용이성을 개선해주는 장점이 있지만 큰 프로젝트에서는 코드를 어지럽힌다는 단점이 있다.

이를 보완하기 위해 프레임워크를 사용하자

  • 대거(Dagger)
  • 주스(Guice)
  • 스프링(Spring)