더북(TheBook)

3.5.4 메서드 주입 사용하기

자주 사용되지 않지만 생성자와 수정자 주입 이외에 스프링이 제공하는 DI 기능으로 메서드 주입이 있습니다. 스프링의 메서드 주입은 두 가지 느슨하게 관련된(loosely related) 형태인 룩업 메서드 주입(Lookup Method Injection)과 메서드 대체(Method Replacement) 방식이 제공됩니다. 룩업 메서드 주입은 빈이 자신의 의존성을 가져올 수 있는 또 다른 메커니즘을 제공합니다. 메서드 대체를 사용하면 원래 소스 코드를 변경하지 않고 임의로 메서드 구현을 변경할 수 있습니다. 이 두 가지 기능을 제공하기 위해 스프링은 CGLIB4의 동적 바이트 코드 확장 기능을 사용합니다.

 

3.5.4.1 룩업 메서드 주입

룩업 메서드 주입은, 싱글턴 빈이 비싱글턴 빈에 의존하는 상황과 같이 어떤 빈이 다른 라이프 사이클을 가진 빈에 의존할 때 발생하는 문제를 극복하려고 스프링 1.1 버전에 추가됐습니다. 이런 상황에서 수정자 주입이나 생성자 주입을 사용하면 싱글턴 빈은 의존하는 비싱글턴 빈을 싱글턴으로 만들어 버립니다. 또한, 상황에 따라 싱글턴 빈은 자신에게 필요한 비싱클톤 빈 인스턴스를 매번 새로 생성해 얻고 싶을 수 있습니다.

어떤 사물함(Locker)을 여는 서비스를 제공하는 LockOpener 클래스에 대한 시나리오를 생각해보겠습니다. LockOpener 클래스는 자신에게 주입된, 사물함을 여는 클래스인 KeyHelper 클래스에 의존합니다. 이때 KeyHelper 클래스는 재사용에 적합하지 않은 일부 내부 상태 정보를 갖도록 설계되어 있습니다. 그러므로 openLock() 메서드가 호출될 때마다 새로운 KeyHelper 인스턴스가 필요합니다. 이 시나리오에서는 LockOpener가 싱글턴이라고 가정합니다. 이런 상황에서, 일반적인 메커니즘을 사용해 KeyHelper 클래스를 주입하면 KeyHelper 클래스의 동일한 인스턴스(스프링이 맨 처음 주입을 수행할 때 생성한 인스턴스)가 다시 사용됩니다. openLock() 메서드가 호출될 때마다 새 KeyHelper 인스턴스를 전달하려면 룩업 메서드 주입을 이용해야 합니다.

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