스프링에서 자신을 DI하는 빈을 정의할 수 있을까?
자신과 같은 타입을 참조하는 클래스는 자주 사용된다. 물론 이 경우 참조하는 대상은 같은 타입의 다른 오브젝트일 것이다. 오브젝트 자신이라면 this를 사용해서 참조하거나, 아예 레퍼런스 없이 그냥 접근해도 그만이다.
그렇다면 오브젝트 레벨의 정의인 스프링 빈의 경우 스스로를 참조하는, 즉 프로퍼티로 가지는 정의를 만드는 것이 가능할까?
예를 들면 다음과 같은 경우다.
<bean id=”mybean” class=”Bean”>
<property name=”me” ref=”mybean”>
</bean>
class Bean {
Bean me;
..
}
자신과 같은 타입에 대한 레퍼런스를 가질 뿐더러, 그 레퍼런스 정보를 외부에서 DI 받도록 만들고 그 대상을 자신으로 하는 경우이다.
일단 정의 가능성만 놓고 보자면 가능하다.
스프링은 오브젝트 생성에 문제가 되지만 않으면 어떤 순환/상호 참조도 허용한다. 양쪽다 CI(생성자주입) 방식을 사용하는 경우가 아니라면 생성과 프로퍼티 주입에 문제는 없다. 따라서 일단 Bean 오브젝트를 만든 후 자신을 레퍼런스로 프로퍼티로 넣는 것도 아무 문제 없이 가능하다. 가장 단순하고 극단적인 순환참조가 되겠지만.
그렇다면 이런 식의 빈 설정이 과연 필요한가? 오브젝트 자신에 대한 접근을 마치 다른 오브젝트에 접근하는 것처럼 구지 꾸밀 필요가 있겠느냔 말이다. 나는 있다고 본다.
가장 대표적인 경우는 스스로 어떤 오브젝트와 그 협력오브젝트가 동시에 되는 경우이다. 정확히 말하자면 자신이 의존하고 있는 인터페이스를 스스로 구현하는 경우라고 볼 수 있다.
클래스 레벨에서 A->B(인터페이스)라는 의존관계를 가지고 있을 때 DI는 B를 구현한 실제 클래스에 대한 정보를 A로부터 완전히 제거시키도록 해주는 기술이다. 그것이 B1,B2 같은 다른 클래스일 수도 있고, A의 이너클래스일 수도 있고, 콜백처럼 일회성으로 만들어진 익명클래스일 수도 있다.
심지어 B를 구현했다면 A자신 일 수도 있다는 것이다. 그리고 이 방법은 종종 유용하게 사용될 수 있다.
보통은 선언에 일일히 넣지 않고 디폴트 DI기법을 사용하는 게 낫다.
스프링 스스로 이 방법을 종종 사용하고 있다.
글 내용을 심각하게 받아들이지 않아서 서운할 수 있겠지만…
오랜만에 디자인 바꿨는데
조금… 많이… 상당히 구린데…
디자인 학원 다녀야 하는거 아냐?
영회/ 음주코멘트 하는 악플러네
구글 크롬 테마야
구글 디자인을 싫어하나보군
그리고 술먹고 한밤 중에 전화좀 하지마
낮에 해