Spring Framework 7.1.0-SNAPSHOT 기준
spring-aop은 메서드 호출을 가로채(intercept) 부가 기능을 주입하는 프록시 기반 AOP 엔진이다. JDK 동적 프록시와 CGLIB을 이용해 대상 객체를 감싸고, Advisor(Pointcut + Advice)로 "어디에 무엇을 적용할지"를 선언하며, @AspectJ 애너테이션과 IoC 컨테이너의 자동 프록시 생성을 통해 이를 투명하게 엮어 준다.
트랜잭션, 보안, 로깅, 캐싱처럼 여러 클래스에 횡단으로 반복되는 관심사(cross-cutting concern) 를 비즈니스 코드에서 분리하고 싶다. 하지만 자바에는 메서드 호출을 가로채는 언어 기능이 없다. spring-aop는 이 문제를 다음 방식으로 해결한다.
- 프록시: 대상과 동일한 타입(인터페이스 혹은 서브클래스)의 대리 객체를 만들어, 호출자가 프록시를 거치도록 한다. (
JdkDynamicAopProxy,CglibAopProxy) - 인터셉터 체인: 가로챈 호출을
MethodInterceptor들의 체인으로 통과시키고, 마지막에 실제 대상 메서드를 리플렉션으로 호출한다. (ReflectiveMethodInvocation) - 선언적 매칭:
Pointcut(ClassFilter + MethodMatcher)으로 "어떤 메서드에 적용할지"를,Advice로 "무엇을 할지"를 분리한다. - 자동 적용:
BeanPostProcessor(AbstractAutoProxyCreator)가 컨테이너 초기화 과정에서 빈을 자동으로 프록시로 교체한다. @AspectJ 애스펙트도 여기서 Advisor로 변환되어 합류한다.
이 모듈은 AOP "엔진" 만 담당한다. @Transactional이나 @Async 같은 실제 애스펙트는 각각 spring-tx, spring-context가 이 엔진 위에 얹는 인터셉터다.
┌──────────────────────────────────────────┐
사용처 │ spring-tx · spring-context(@Async,@Cache) │
│ spring-context(@EnableAspectJAutoProxy) │
└─────────────────────┬────────────────────┘
│ 사용
┌─────────▼─────────┐
│ spring-aop │
└─────────┬─────────┘
│ 의존
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
spring-core spring-beans (선택) AspectJ weaver
(리플렉션 유틸, (BeanFactory, org.aspectj:aspectjweaver
Ordered, CGLIB 재패키징) BeanPostProcessor) (@AspectJ 표현식 파싱)
- 의존하는 모듈:
spring-core(리플렉션·CGLIB 재패키징·Ordered),spring-beans(BeanFactory·BeanPostProcessor 통합). AspectJ 포인트컷 표현식을 쓰려면aspectjweaver가 클래스패스에 필요하다. - 이 모듈에 의존하는 모듈:
spring-tx(트랜잭션 인터셉터),spring-context(@Async·@Cacheable·@EnableAspectJAutoProxy·scoped proxy) 등 선언적 기능 대부분. - 표준 API:
org.aopalliance.*패키지(AOP Alliance 표준Advice/MethodInterceptor/MethodInvocation)를 그대로 품고 있어, 인터셉터 모델이 벤더 중립 표준을 따른다.
이 모듈은 규모가 크므로 6개의 챕터로 나눈다. 추천 읽는 순서는 번호 순이다.
- 01-핵심-개념-Advice-Pointcut-Advisor.md — AOP 용어 모델: Joinpoint·Advice·Pointcut·Advisor·TargetSource가 무엇이고 어떻게 조합되는가.
- 02-프록시-생성-JDK-CGLIB.md —
ProxyFactory/AdvisedSupport에서 프록시가 만들어지는 과정과 JDK vs CGLIB 선택 규칙. - 03-인터셉터-체인과-호출-흐름.md — 프록시 메서드가 호출되면 인터셉터 체인이 어떻게 구성·실행되는가(
ReflectiveMethodInvocation,DefaultAdvisorChainFactory). - 04-자동-프록시-생성기.md —
BeanPostProcessor기반 자동 프록시:AbstractAutoProxyCreator계열이 컨테이너에서 빈을 어떻게 감싸는가. - 05-AspectJ-지원.md — @AspectJ 애너테이션을 Advisor로 변환하는 메커니즘과 around/before/after 어드바이스 구현.
- 06-TargetSource와-어댑터.md — 대상 객체 공급 전략(pooling·hot-swap·thread-local·scoped)과 Advice→Interceptor 어댑터 레지스트리.
spring-aop/src/main/java
│
├── org/aopalliance/ ★ AOP Alliance 표준 API (벤더 중립)
│ ├── aop/ Advice (마커 인터페이스)
│ └── intercept/ Joinpoint, MethodInvocation,
│ MethodInterceptor, ConstructorInterceptor
│
└── org/springframework/aop/
│ (모듈 루트: 핵심 추상화 인터페이스 모음)
│ Pointcut, ClassFilter, MethodMatcher ← "어디에"
│ Advisor, PointcutAdvisor, IntroductionAdvisor
│ TargetSource, TargetClassAware ← 대상 공급
│ *Advice (BeforeAdvice, AfterReturningAdvice, ThrowsAdvice ...)
│ SpringProxy, RawTargetAccess, ProxyMethodInvocation
│
├── framework/ ★ 프록시 엔진 (챕터 2·3)
│ │ AopProxy, AopProxyFactory, DefaultAopProxyFactory
│ │ JdkDynamicAopProxy, CglibAopProxy, ObjenesisCglibAopProxy
│ │ AdvisedSupport, Advised, ProxyConfig, ProxyCreatorSupport
│ │ ProxyFactory, ProxyFactoryBean, AbstractSingletonProxyFactoryBean
│ │ ReflectiveMethodInvocation, AdvisorChainFactory,
│ │ DefaultAdvisorChainFactory, AopContext, AopProxyUtils
│ ├── adapter/ Advice→MethodInterceptor 어댑터 (챕터 6)
│ │ AdvisorAdapterRegistry,
│ │ MethodBeforeAdviceInterceptor 등
│ └── autoproxy/ ★ 자동 프록시 BeanPostProcessor (챕터 4)
│ │ AbstractAutoProxyCreator, AbstractAdvisorAutoProxyCreator
│ │ BeanNameAutoProxyCreator, DefaultAdvisorAutoProxyCreator
│ │ InfrastructureAdvisorAutoProxyCreator
│ │ BeanFactoryAdvisorRetrievalHelper
│ └── target/ 풀링 등 TargetSource 자동 생성기
│
├── aspectj/ ★ @AspectJ 지원 (챕터 5)
│ │ AbstractAspectJAdvice, AspectJAroundAdvice, AspectJMethodBeforeAdvice,
│ │ AspectJAfterAdvice / AfterReturning / AfterThrowing
│ │ AspectJExpressionPointcut, MethodInvocationProceedingJoinPoint
│ ├── annotation/ 애스펙트 → Advisor 변환 공장
│ │ ReflectiveAspectJAdvisorFactory,
│ │ AnnotationAwareAspectJAutoProxyCreator,
│ │ AspectJProxyFactory, AspectMetadata
│ └── autoproxy/ AspectJAwareAdvisorAutoProxyCreator,
│ AspectJPrecedenceComparator
│
├── support/ ★ 구체 Pointcut/Advisor 구현 (챕터 1)
│ │ AopUtils, DefaultPointcutAdvisor, DefaultIntroductionAdvisor
│ │ NameMatchMethodPointcut, JdkRegexpMethodPointcut, ComposablePointcut
│ │ StaticMethodMatcher, DynamicMethodMatcher, Pointcuts, ClassFilters
│ └── annotation/ 애너테이션 기반 포인트컷
│
├── interceptor/ 바로 쓰는 인터셉터 모음
│ ExposeInvocationInterceptor,
│ DebugInterceptor, AsyncExecutionInterceptor,
│ PerformanceMonitorInterceptor 등
│
├── target/ ★ TargetSource 구현 (챕터 6)
│ │ SingletonTargetSource, HotSwappableTargetSource,
│ │ ThreadLocalTargetSource, CommonsPool2TargetSource,
│ │ LazyInitTargetSource, PrototypeTargetSource
│ └── dynamic/ Refreshable, AbstractRefreshableTargetSource
│
├── scope/ 스코프 프록시 (ScopedProxyFactoryBean 등)
│
└── config/ XML 네임스페이스 & 설정 유틸
AopConfigUtils, AopNamespaceHandler,
ConfigBeanDefinitionParser
각 ★ 표시가 챕터의 주제다. 다음 장부터는 모듈 루트의 핵심 추상화(챕터 1)에서 시작해, 그 추상화가 실제 프록시·체인·자동화·AspectJ로 어떻게 구체화되는지 따라간다.