Spring Framework/Spring AOP APIs

Using the "auto-proxy" facility

헬로우월드 2024. 11. 17. 13:07

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 컨텍스트에서 빈들이 자동으로 프록시되며, 이와 관련된 구성을 깔끔하게 유지할 수 있습니다.