Spring Framework/Spring AOP APIs

DefaultAdvisorAutoProxyCreator

헬로우월드 2025. 6. 16. 21:27

DefaultAdvisorAutoProxyCreator는 Spring AOP의 핵심 자동 프록시 생성기 중 하나로, 등록된 Advisor 빈을 기반으로 자동으로 프록시를 생성하는 고급 자동 프록시 생성기입니다.
이를 통해 트랜잭션, 보안, 로깅 등 다양한 AOP 기능을 관심사 분리 원칙에 따라 적용할 수 있도록 설계되어 있습니다.

 

📌 핵심 요약: DefaultAdvisorAutoProxyCreator란?

Advisor(즉, Pointcut + Advice 조합)를 기반으로
포인트컷에 매칭되는 빈들에 대해 자동으로 프록시를 생성해주는 BeanPostProcessor입니다.

  • 트랜잭션 AOP (@Transactional)
  • 보안 AOP (@Secured)
  • 커스텀 AOP (MethodInterceptor 사용)

위와 같은 기능들이 모두 DefaultAdvisorAutoProxyCreator를 통해 자동 프록시 적용됩니다.

 

🧬 클래스 계층 구조

Object
└── org.springframework.aop.framework.ProxyConfig
    └── org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
        └── org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator
            └── org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
클래스 역할
ProxyConfig 프록시 관련 설정 (proxyTargetClass, exposeProxy 등)
AbstractAutoProxyCreator 모든 AutoProxyCreator의 공통 베이스 (BeanPostProcessor 기능)
AbstractAdvisorAutoProxyCreator Advisor 탐색 및 평가 기능 제공
DefaultAdvisorAutoProxyCreator 가장 일반적인 형태의 Advisor 기반 자동 프록시 생성기

 

⚙️ 작동 원리

 

🔁 Bean 생성 사이클 개입

DefaultAdvisorAutoProxyCreatorBeanPostProcessor를 구현하고 있기 때문에 모든 빈 생성 시 다음 과정을 거칩니다:

Object postProcessAfterInitialization(Object bean, String beanName) {
    if (isInfrastructureClass(bean.getClass())) return bean;
    return wrapIfNecessary(bean, beanName);
}

 

🔍 핵심 메서드: wrapIfNecessary

  1. 빈이 Advisor의 Pointcut 조건에 매칭되는지 확인
  2. 매칭된다면, 프록시 객체를 생성하고 Advice 체인을 구성
  3. 실제 빈 대신 프록시 객체를 IoC 컨테이너에 등록

🧩 Advisor란?

Advisor = Pointcut + Advice

예: 트랜잭션 어드바이저

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

여기서 TransactionAttributeSourceAdvisor는 내부적으로 MethodMatcher 기반 포인트컷을 포함하고 있으며,
해당 조건을 만족하는 빈 메서드에 TransactionInterceptor를 적용합니다.

 

🛠️ 설정 예시

@Bean
public static DefaultAdvisorAutoProxyCreator autoProxyCreator() {
    return new DefaultAdvisorAutoProxyCreator();
}

 

그리고 Advisor 등록:

@Bean
public DefaultPointcutAdvisor myAdvisor() {
    NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
    pointcut.setMappedName("save*");

    MethodInterceptor advice = new MethodInterceptor() {
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("Before method: " + invocation.getMethod().getName());
            return invocation.proceed();
        }
    };

    return new DefaultPointcutAdvisor(pointcut, advice);
}

→ 이름이 "save*"인 메서드가 존재하는 빈에 대해서 자동으로 프록시를 생성하고, before 로그 출력

 

🔍 내부 흐름

1. getAdvicesAndAdvisorsForBean(...)

이 메서드는 빈 하나당 어떤 Advisor가 적용 가능한지 판단:

for (Advisor advisor : findEligibleAdvisors(beanClass, beanName)) {
    if (advisorApplies(advisor, beanClass, beanName)) {
        applyAdvisor(...)
    }
}

2. findCandidateAdvisors()

  • 모든 Advisor 빈을 컨테이너에서 가져옴

3. isEligibleAdvisorBean(...)

  • 내부 필터링 조건 (기본은 전부 허용)

 

⚖️ 특징 및 장점

항목 설명
유연성 다양한 Advisor(Pointcut/Advice 조합)를 통해 정교한 AOP 적용 가능
트랜잭션, 보안 지원 @Transactional, @Secured, @Cacheable 등의 동작 기반
확장성 커스텀 Advisor도 자유롭게 추가 가능
기본 제공 @EnableTransactionManagement, @EnableAspectJAutoProxy 등에 자동 포함됨

 

⚠️ 주의사항

  1. Advisor 미등록 시 무용지물
    • DefaultAdvisorAutoProxyCreatorAdvisor가 등록되어 있어야 작동합니다.
  2. 중복 프록시 방지
    • 하나의 빈에 대해 여러 AOP가 적용될 경우 순서 관리 필요 (@Order, Ordered 인터페이스 사용)
  3. JDK vs CGLIB
    • 기본은 인터페이스 기반 JDK 프록시
    • proxyTargetClass = true로 CGLIB 강제 가능 (@EnableTransactionManagement(proxyTargetClass = true) 등)

 

🧾 정리

항목 설명
목적 Advisor(Pointcut + Advice)에 따라 자동으로 AOP 프록시를 생성
대상 컨테이너 내 모든 일반 빈 (Pointcut 조건에 일치할 경우)
주요 동작 빈 생성 후, Advisor 조건 평가 → 프록시 래핑 → Advice 적용
사용 사례 트랜잭션 처리, 보안 권한 체크, 커스텀 AOP 로직 적용 등
핵심 클래스 DefaultAdvisorAutoProxyCreator + Advisor + MethodInterceptor