DefaultAdvisorAutoProxyCreator
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 생성 사이클 개입
DefaultAdvisorAutoProxyCreator
는 BeanPostProcessor
를 구현하고 있기 때문에 모든 빈 생성 시 다음 과정을 거칩니다:
Object postProcessAfterInitialization(Object bean, String beanName) {
if (isInfrastructureClass(bean.getClass())) return bean;
return wrapIfNecessary(bean, beanName);
}
🔍 핵심 메서드: wrapIfNecessary
- 빈이 Advisor의 Pointcut 조건에 매칭되는지 확인
- 매칭된다면, 프록시 객체를 생성하고 Advice 체인을 구성
- 실제 빈 대신 프록시 객체를 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 등에 자동 포함됨 |
⚠️ 주의사항
- Advisor 미등록 시 무용지물
DefaultAdvisorAutoProxyCreator
는 Advisor가 등록되어 있어야 작동합니다.
- 중복 프록시 방지
- 하나의 빈에 대해 여러 AOP가 적용될 경우 순서 관리 필요 (
@Order
,Ordered
인터페이스 사용)
- 하나의 빈에 대해 여러 AOP가 적용될 경우 순서 관리 필요 (
- JDK vs CGLIB
- 기본은 인터페이스 기반 JDK 프록시
proxyTargetClass = true
로 CGLIB 강제 가능 (@EnableTransactionManagement(proxyTargetClass = true)
등)
🧾 정리
항목 | 설명 |
---|---|
목적 | Advisor(Pointcut + Advice)에 따라 자동으로 AOP 프록시를 생성 |
대상 | 컨테이너 내 모든 일반 빈 (Pointcut 조건에 일치할 경우) |
주요 동작 | 빈 생성 후, Advisor 조건 평가 → 프록시 래핑 → Advice 적용 |
사용 사례 | 트랜잭션 처리, 보안 권한 체크, 커스텀 AOP 로직 적용 등 |
핵심 클래스 | DefaultAdvisorAutoProxyCreator + Advisor + MethodInterceptor |