Skip to content

Latest commit

 

History

History
124 lines (108 loc) · 9.47 KB

File metadata and controls

124 lines (108 loc) · 9.47 KB

spring-aop — Spring AOP 프레임워크

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개의 챕터로 나눈다. 추천 읽는 순서는 번호 순이다.

  1. 01-핵심-개념-Advice-Pointcut-Advisor.md — AOP 용어 모델: Joinpoint·Advice·Pointcut·Advisor·TargetSource가 무엇이고 어떻게 조합되는가.
  2. 02-프록시-생성-JDK-CGLIB.mdProxyFactory/AdvisedSupport에서 프록시가 만들어지는 과정과 JDK vs CGLIB 선택 규칙.
  3. 03-인터셉터-체인과-호출-흐름.md — 프록시 메서드가 호출되면 인터셉터 체인이 어떻게 구성·실행되는가(ReflectiveMethodInvocation, DefaultAdvisorChainFactory).
  4. 04-자동-프록시-생성기.mdBeanPostProcessor 기반 자동 프록시: AbstractAutoProxyCreator 계열이 컨테이너에서 빈을 어떻게 감싸는가.
  5. 05-AspectJ-지원.md — @AspectJ 애너테이션을 Advisor로 변환하는 메커니즘과 around/before/after 어드바이스 구현.
  6. 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로 어떻게 구체화되는지 따라간다.