Loading...
Spring Framework Reference Documentation 7.0.2의 Using the "auto-proxy" facility의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
지금까지 우리는 ProxyFactoryBean 또는 이와 유사한 factory bean을 사용하여 AOP 프록시를 명시적으로 생성하는 방법을 살펴보았습니다.
Spring은 선택된 bean 정의들을 자동으로 프록시할 수 있는 “auto-proxy” bean 정의들도 사용할 수 있게 해 줍니다. 이것은 Spring의 “bean post processor” 인프라스트럭처 위에 구축되어 있으며, 컨테이너가 로드될 때 어떤 bean 정의든 수정할 수 있게 해 줍니다.
이 모델에서, XML bean 정의 파일에 몇 가지 특별한 bean 정의를 설정하여 auto-proxy 인프라스트럭처를 구성합니다. 이를 통해 auto-proxying 대상이 될 타깃들을 선언할 수 있습니다. ProxyFactoryBean을 사용할 필요는 없습니다.
이를 수행하는 방법은 두 가지가 있습니다:
이 섹션에서는 org.springframework.aop.framework.autoproxy 패키지에서 제공하는 auto-proxy creator들을 다룹니다.
BeanNameAutoProxyCreatorBeanNameAutoProxyCreator 클래스는 literal value 또는 와일드카드와 일치하는 이름을 가진 bean들에 대해 AOP 프록시를 자동으로 생성하는 BeanPostProcessor입니다. 다음 예제는 BeanNameAutoProxyCreator bean을 생성하는 방법을 보여 줍니다:
1<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 2 <property name="beanNames" value="jdk*,onlyJdk"/> 3 <property name="interceptorNames"> 4 <list> 5 <value>myInterceptor</value> 6 </list> 7 </property> 8</bean>
ProxyFactoryBean과 마찬가지로, 프로토타입 advisor에 대해 올바른 동작을 허용하기 위해 interceptor 리스트 대신 interceptorNames 프로퍼티가 있습니다. 이름이 지정된 “interceptors”는 advisor이거나 어떤 advice 타입도 될 수 있습니다.
일반적인 auto-proxying과 마찬가지로, BeanNameAutoProxyCreator를 사용하는 주요 목적은 적은 양의 설정으로 동일한 설정을 여러 객체에 일관되게 적용하는 것입니다. 이것은 여러 객체에 선언적 트랜잭션을 적용하는 데 인기 있는 선택입니다.
앞의 예제에서 jdkMyBean과 onlyJdk처럼 이름이 일치하는 bean 정의들은 타깃 클래스를 가진 평범한 bean 정의입니다. AOP 프록시는 BeanNameAutoProxyCreator에 의해 자동으로 생성됩니다. 동일한 advice가 일치하는 모든 bean에 적용됩니다. advisor(앞의 예제에서 interceptor가 아닌)를 사용하는 경우, 포인트컷이 bean마다 다르게 적용될 수 있다는 점에 유의하십시오.
DefaultAdvisorAutoProxyCreator보다 일반적이고 매우 강력한 auto-proxy creator는 DefaultAdvisorAutoProxyCreator입니다. 이것은 auto-proxy advisor의 bean 정의에 특정 bean 이름을 포함할 필요 없이 현재 컨텍스트에서 적격한 advisor들을 자동으로 적용합니다. 이는 BeanNameAutoProxyCreator와 마찬가지로 일관된 설정과 중복 회피라는 동일한 장점을 제공합니다.
이 메커니즘을 사용하는 것은 다음을 포함합니다:
DefaultAdvisorAutoProxyCreator bean 정의를 지정합니다.DefaultAdvisorAutoProxyCreator는 각 advisor에 포함된 포인트컷을 자동으로 평가하여, 각 비즈니스 객체(예제의 businessObject1과 businessObject2 등)에 어떤(있는 경우) advice를 적용해야 하는지 확인합니다.
이는 원하는 수만큼의 advisor가 각 비즈니스 객체에 자동으로 적용될 수 있음을 의미합니다. 어떤 advisor의 포인트컷도 비즈니스 객체의 어떤 메서드와도 일치하지 않으면, 그 객체는 프록시되지 않습니다. 새로운 비즈니스 객체에 대한 bean 정의가 추가되면, 필요하다면 자동으로 프록시됩니다.
일반적으로 auto-proxying은 호출자나 의존성이 advice되지 않은 객체를 얻는 것이 불가능해진다는 장점이 있습니다. 이 ApplicationContext에서 getBean("businessObject1")을 호출하면 타깃 비즈니스 객체가 아니라 AOP 프록시를 반환합니다. (앞에서 보여 준 “inner bean” idiom 또한 이 이점을 제공합니다.)
다음 예제는 DefaultAdvisorAutoProxyCreator bean과 이 섹션에서 논의된 다른 element들을 생성합니다:
1<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 2 3<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> 4 <property name="transactionInterceptor" ref="transactionInterceptor"/> 5</bean> 6 7<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/> 8 9<bean id="businessObject1" class="com.mycompany.BusinessObject1"> 10 <!-- Properties omitted --> 11</bean> 12 13<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>
DefaultAdvisorAutoProxyCreator는 동일한 advice를 많은 비즈니스 객체에 일관되게 적용하려는 경우 매우 유용합니다. 인프라스트럭처 정의가 준비되면, 특정 프록시 설정을 포함하지 않고도 새로운 비즈니스 객체를 추가할 수 있습니다. 또한 설정 변경을 최소화하면서 트레이싱이나 성능 모니터링 애스펙트와 같은 추가 애스펙트를 손쉽게 추가할 수 있습니다.
DefaultAdvisorAutoProxyCreator는 (네이밍 컨벤션을 사용하여 특정 advisor만 평가되도록 함으로써, 동일한 factory 내에서 여러 개의, 서로 다르게 구성된 AdvisorAutoProxyCreator를 사용할 수 있게 해 주는) 필터링과 순서 지정을 위한 지원을 제공합니다. advisor는 org.springframework.core.Ordered 인터페이스를 구현하여, 이것이 문제가 되는 경우 올바른 순서를 보장할 수 있습니다. 앞의 예제에서 사용된 TransactionAttributeSourceAdvisor는 설정 가능한 order 값을 가집니다. 기본 설정은 순서 없음입니다.
Manipulating Advised Objects
Using TargetSource Implementations