더북(TheBook)

3.2.5 의존성 주입 vs. 의존성 룩업

의존성 주입과 의존성 룩업 중에 어떤 것을 선택할지 결정하는 일은 일반적으로 어렵지 않습니다. 많은 경우에 현재 사용하는 컨테이너에 따라 IoC의 방식이 정해집니다. 예를 들어 EJB 2.1 이하 버전을 사용할 때 EJB를 JEE 컨테이너에서 가져오려면 의존성 룩업(JNDI를 통한) 방식의 IoC를 사용해야 합니다. 스프링에서는 초기 빈 룩업을 제외하면 컴포넌트와 의존성은 항상 의존성 주입 방식의 IoC를 이용해 연결됩니다.

Note 스프링을 사용할 때는 명시적인 의존성 룩업을 수행하지 않고도 EJB 자원에 접근할 수 있습니다. 스프링이 의존성 룩업과 의존성 주입 방식의 시스템 사이에서 어댑터 역할을 할 수 있으므로 의존성 주입을 사용해 모든 리소스를 관리할 수 있습니다.

 

이때 정말 궁금한 것은 의존성 주입과 의존성 룩업 중에서 선택해야만 한다면 어떤 것을 선택해야 하는지입니다. 이 질문에 대한 정답은 당연히 의존성 주입입니다. 앞서 예제 코드에서 보았듯이 의존성 주입이 컴포넌트에 어떠한 코드 변화도 일으키지 않는다는 것을 알 수 있습니다. 반면에 의존성 풀을 이용하는 코드는 레지스트리에 대한 참조를 얻어와서 의존성을 얻으려고 상호작용을 해야 합니다. 또한, CDL을 사용하면 클래스는 특정 인터페이스를 구현하고 모든 의존성을 직접 가져와야 합니다. 반면 의존성 주입을 사용하면 대부분의 클래스가 해야 할 일은 생성자나 수정자로 의존성이 주입될 수 있게 하는 것뿐입니다.

의존성 주입을 이용하면 사용자 클래스는 협력 객체(collaborator)를 의존 객체에게 제공하는 IoC 컨테이너와 완전히 분리돼 자유롭게 사용될 수 있는 반면에, 룩업을 이용하면 사용자 클래스는 컨테이너에 의해 정의된 클래스와 인터페이스에 항상 의존하게 됩니다. 룩업의 또 다른 단점은 클래스를 컨테이너와 분리시킨 채 테스트하기가 어렵다는 점입니다. 주입을 이용하면 적절한 생성자나 수정자를 사용해 사용자가 직접 테스트용 의존성을 쉽게 제공할 수도 있으므로 컴포넌트를 쉽게 테스트할 수 있습니다.

Note 의존성 주입과 스프링을 사용해 테스트하는 자세한 방법은 13장을 참조하기 바랍니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.