[Effective Java] 의존 객체 주입

dongbin_Shin·2022년 1월 24일
0

이펙티브 자바

목록 보기
5/5
post-thumbnail

클래스가 내부적으로 하나 이상의 자원에 의존하고, 클래스의 동작이 그 자원에 종속적일 경우 의존 객체 주입을 사용하자.

자원에 의존하는 클래스

많은 경우 클래스가 내부적으로 하나 이상의 자원에 의존한다. Beverage에 의존하는 Coffee라는 클래스가 있다고 가정하자.

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

이 경우 정적 유틸리티를 사용한다면 아래와 같은 형태가 될 것이다.

public class Coffee {
    private static final Beverage beverage = ...;
    private Coffee() {} // 객체 생성 방지
}

싱글톤으로 구현

또 싱글톤으로도 구현할 수 있을 것이다.

public class Coffee {
    private final Beverage beverage = ...;
    private Coffee(...) {}
    public static Coffee Instance = new Coffee(...);
}

문제점

위의 두 방식 모두 beverage를 단 하나만 사용한다는 점에서 기능 확장, 테스트 측면에서 유연하지 못하다. 그렇다고 final을 제거한다면 오류를 내기 쉬워지고 멀티 스레드 환경에서 사용할 수 없다. 즉, 사용하는 자원에 동작이 의존하는 클래스인 경우 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않다

의존 객체 주입 (Dependency Injection)

클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 하는 조건에서 의존 객체 주입 방식이 가장 적절하다.

public class Coffee {
    private final Beverage beverage;
    public Coffee(Beverage bev) {
        beverage = bev;
    }
}

이 경우 자원이 몇개든 의존 관계가 어떻든 상관없이 잘 동작하게 된다. 또한 불변을 보장할 수 있다. 의존 객체 주입은 생성자, 정적 팩토리, 빌더에 모두 응용 가능하다.

이 방식의 응용 버전으로 Supplier<T> 인터페이스, 즉 자원 팩토리를 생성자에 넘겨주는 방식이 있다.

Mosaic create(Supplier<? extends Tile> tileFactory) {...}

단점

의존성이 수 천 개나 되는 큰 프로젝트에서는 의존 객체 주입이 코드를 복잡하게 만들기도 한다. Spring, Dagger 등의 프레임워크들은 이런 복잡함을 해결하면서 의존 객체 주입을 사용할 수 있도록 만들어 준다.

profile
멋있는 백엔드 개발자

0개의 댓글