더북(TheBook)

일반적으로 싱글턴 빈에 ApplicationContextAware 인터페이스를 구현하면 이런 작업을 수행할 수 있습니다(ApplicationContextAware 인터페이스에 대해서는 다음 장에서 살펴봅니다). ApplicationContextAware 인터페이스를 구현하면 싱글턴 빈은 ApplicationContext 인스턴스를 사용해서 필요할 때마다 비싱글턴 의존성의 새 인스턴스를 룩업할 수 있습니다. 룩업 메서드 주입을 이용하면 별도의 스프링 인터페이스를 구현하지 않고서도 싱글턴 빈이 비싱글턴 빈 의존성을 필요로 하는 경우에 선언하여, 필요할 때마다 비싱글턴 빈의 새로운 인스턴스를 얻을 수 있게 해줍니다.

룩업 메서드 주입은 비싱글턴 빈의 인스턴스를 반환하는 룩업 메서드를 싱글턴 빈에 선언함으로써 동작합니다. 애플리케이션에서 싱글턴에 대한 참조를 얻을 때, 스프링이 구현해 둔 룩업 메서드를 사용해서 동적으로 생성된 서브 클래스에 대한 참조를 받습니다. 일반적인 룩업 메서드 구현 클래스는 룩업 메서드를 구현 없이 정의하기만 하므로 구현 클래스를 abstract로 선언합니다. 이렇게 구현 클래스를 abstract로 선언하면 메서드 주입 구성을 잊어버렸을 때 스프링이 수정한 서브 클래스의 메서드가 아닌 텅 빈 메서드 구현에서 가져온 빈 클래스를 직접 사용해 발생하는 이상한 문제를 방지합니다. 이 주제는 매우 복잡하지만 예제를 통해 잘 이해할 수 있습니다.

다음 예제에서는 하나의 비싱글턴 빈과 두 개의 싱글턴 빈을 생성합니다. 싱글턴 빈 중 하나는 “전통적인” 수정자 주입을 사용해 비싱글턴 빈 인스턴스를 얻습니다. 다른 하나는 메서드 주입을 사용합니다. 다음 예제 코드는 Singer 클래스입니다. 이 예제에서 이 클래스는 비싱글턴 빈 타입입니다.

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