본문 바로가기

SpringFramework Core - I. IoC 컨테이너/5. Bean Scopes

5.4.6. 생성을 위한 프록시 종류 고르기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes-other-injection-proxies

 

 

<aop:scoped-proxy/> 요소로 bean을 위한 프록시를 만들 때, 스프링 컨테이너는 기본적으로 CGLIB 기반 클래스의 프록시를 만든다.

 

CGLIB 프록시는 오직 public 메소드 호출만을 가로챈다! 이 프록시에 public하지 않은 메소드는 호출하지 말자. 그런 메소드들은 실제 대상 객체로부터 위임받은 적이 없기 때문이다.

 

대안으로, <aop:scoped-proxy/> 요소의 'proxy-target-class' 속성을 false로 설정함으로써, 표준 JDK 인터페이스 기반의 프록시를 스프링 컨테이너가 만들도록 설정할 수 있다.  JDK 인터페이스 기반의 프록시를 사용한다는 것은, 프록시들에게 애플리케이션 클래스패스에 있는 추가적인 라이브러리들을 적용하지 않겠다는 의미가 된다. 하지만 이는 또한 scoped bean이 반드시 최소한 하나의 인터페이스를 구현해야한다는 뜻이 되기도 하며, 그러므로 scoped bean이 주입된 모든 협력자들은 반드시 구현된 인터페이스들 중 하나를 통해서만 참조를 할 수 있다는 뜻이 된다. 다음 예시는 인터페이스 기반의 프록시를 보여준다.

<!-- DefaultUserPreferences는 UserPreferences 인터페이스를 구현한다 -->
<bean id="userPreferences" class="com.stuff.DefaultUserPreferences" scope="session">
    <aop:scoped-proxy proxy-target-class="false" />
</bean>


<bean id="userManager" class="com.stuff.UserManager">
    <property name="userPreferences" ref="userPreferences" />
</bean>

클래스 기반 또는 인터페이스 기반의 프록시를 선택하는 것과 관련하여 더 자세한 정보를 원한다면, Proxying Mechanisms를 참고하라.