Spring AOP
AOP위빙 방식
- 컴파일 타임 위빙 (Compile-Time Weaving)
- 소스 코드 컴파일 시, Aspect가 대상 객체에 결합됩니다.
- AspectJ 같은 프레임워크에서는 가능하지만, Spring AOP는 이 방식을 지원하지 않습니다.
- 로드 타임 위빙 (Load-Time Weaving)
- 클래스 파일을 JVM에 로드할 때 Aspect를 결합합니다.
- Spring AOP는 기본적으로 지원하지 않으나, AspectJ 통합 설정을 통해 사용할 수 있습니다.
- 런타임 위빙 (Runtime Weaving)
- Spring AOP의 기본 방식입니다.
- 런타임에 프록시 객체를 생성하여 부가 기능을 결합합니다.
- JDK 동적 프록시 또는 CGLIB를 사용하여 대상 객체를 프록시로 감싸고, 프록시가 메서드 호출을 가로채서 Advice를 실행합니다.
pointcut : advice를 적용시킬 조건 정의
advice : pointcut으로 적용시킨 프록시에서의 동작 정의
aspect : pointcut + advice
weaving : AOP 가 aspect를 적용시키는 행위
AOP의 PointCut 실행 시점?
- 프록시 생성 시: 클래스 단위에서 PointCut 조건에 따라 프록시가 생성됩니다.
- 메서드 호출 시: 개별 메서드 단위에서 PointCut 조건을 재평가합니다.
PointCut 조건 재평가의 이유:
- 프록시 생성은 클래스 단위로 이루어지지만, PointCut 조건은 메서드 단위로 적용됩니다.
- 런타임 정보(매개변수, 리턴 타입 등)를 기반으로 동적 조건을 평가해야 하는 경우가 있습니다.
- Spring AOP의 유연성과 확장성을 보장하기 위한 설계입니다.
결론 : 실행 시 1번 , 메서드 최초 실행 시 1번. 총 2번만 실행된다.
단, Advice는 메서드 최초 실행시 조건에 부합하다면 매번 실행된다.