Using the "auto-proxy" facility

2024. 11. 17. 13:07Spring Framework/Spring AOP APIs

Using the "auto-proxy" facility

지금까지 우리는 ProxyFactoryBean 또는 유사한 팩토리 빈을 사용하여 명시적으로 AOP 프록시를 생성하는 방법을 살펴보았습니다.

Spring에서는 선택된 빈 정의를 자동으로 프록시할 수 있는 "auto-proxy" 빈 정의를 사용할 수도 있습니다. 이는 컨테이너가 로드될 때 모든 빈 정의를 수정할 수 있는 Spring의 "bean post processor" 인프라에 기반합니다.

이 모델에서는 XML 빈 정의 파일에서 몇 가지 특별한 빈 정의를 설정하여 auto-proxy 인프라를 구성합니다. 이를 통해 자동 프록시 대상 자격이 있는 객체를 선언할 수 있으며, ProxyFactoryBean을 사용할 필요가 없습니다.

이를 수행하는 두 가지 방법이 있습니다:

  1. 현재 컨텍스트에 있는 특정 빈을 참조하는 auto-proxy 생성기를 사용하는 방법.
  2. 소스 레벨 메타데이터 속성에 의해 구동되는 auto-proxy 생성의 특별한 경우.

Auto-proxy 빈 정의

이 섹션에서는 org.springframework.aop.framework.autoproxy 패키지에서 제공하는 auto-proxy 생성기에 대해 설명합니다.

BeanNameAutoProxyCreator

BeanNameAutoProxyCreator 클래스는 빈 이름이 리터럴 값이나 와일드카드와 일치하는 빈에 대해 자동으로 AOP 프록시를 생성하는 BeanPostProcessor입니다. 다음 예제는 BeanNameAutoProxyCreator 빈을 생성하는 방법을 보여줍니다:

XML 기반 구성:

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames" value="jdk*,onlyJdk"/>
    <property name="interceptorNames">
        <list>
            <value>myInterceptor</value>
        </list>
    </property>
</bean>

자바 기반 구성:

@Configuration
public class AppConfig {

    @Bean
    public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
        BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
        creator.setBeanNames("jdk*", "onlyJdk");
        creator.setInterceptorNames("myInterceptor");
        return creator;
    }

    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }
}

위의 자바 기반 구성에서는 BeanNameAutoProxyCreator를 정의하고, 빈 이름 패턴에 맞는 빈들에 대해 자동으로 프록시를 생성합니다. interceptorNames 속성은 XML 기반 구성에서와 마찬가지로 설정됩니다.

DefaultAdvisorAutoProxyCreator

더 일반적이고 매우 강력한 auto-proxy 생성기는 DefaultAdvisorAutoProxyCreator입니다. 이는 현재 컨텍스트에서 적격한 어드바이저를 자동으로 적용하며, auto-proxy 어드바이저의 빈 정의에 특정 빈 이름을 포함할 필요가 없습니다. 이는 BeanNameAutoProxyCreator와 마찬가지로 일관된 구성을 제공하며 중복을 피할 수 있는 장점이 있습니다.

XML 기반 구성:

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>

<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>

<bean id="businessObject1" class="com.mycompany.BusinessObject1">
    <!-- Properties omitted -->
</bean>

<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>

자바 기반 구성:

@Configuration
public class AppConfig {

    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        return new DefaultAdvisorAutoProxyCreator();
    }

    @Bean
    public TransactionAttributeSourceAdvisor transactionAdvisor(TransactionInterceptor transactionInterceptor) {
        TransactionAttributeSourceAdvisor advisor = new TransactionAttributeSourceAdvisor();
        advisor.setTransactionInterceptor(transactionInterceptor);
        return advisor;
    }

    @Bean
    public MyAdvisor customAdvisor() {
        return new MyAdvisor();
    }

    @Bean
    public BusinessObject1 businessObject1() {
        return new BusinessObject1();
    }

    @Bean
    public BusinessObject2 businessObject2() {
        return new BusinessObject2();
    }

    @Bean
    public TransactionInterceptor transactionInterceptor() {
        // TransactionInterceptor 설정 로직
        return new TransactionInterceptor();
    }
}

위의 자바 기반 설정에서는 DefaultAdvisorAutoProxyCreator를 빈으로 등록하여 모든 적격 어드바이저가 자동으로 프록시를 적용할 수 있도록 합니다. 트랜잭션 어드바이저 및 커스텀 어드바이저도 별도로 설정하며, 비즈니스 객체는 필요에 따라 프록시가 생성됩니다.

이 자바 기반 설정은 XML 구성에서 설정했던 것과 동일한 기능을 제공합니다. 이를 통해 Spring IoC 컨텍스트에서 빈들이 자동으로 프록시되며, 이와 관련된 구성을 깔끔하게 유지할 수 있습니다.

'Spring Framework > Spring AOP APIs' 카테고리의 다른 글

Spring AOP APIs  (0) 2024.12.02
Manipulating Advised Objects  (0) 2024.11.17
Creating AOP Proxies Programmatically with the ProxyFactory  (0) 2024.11.17
The Advisor API in Spring  (0) 2024.11.17
Advice API in Spring  (0) 2024.11.17