AOP가 주목하는 관심 사항은 아래와 같다.
- 핵심 관심 사항 : 문제를 해결하기 위함.
- 공통 관심 사항 : 전체에 적용하기 위함.
이 때, 공통 관심 사항을 Aspect라는 독특한 모듈 형태로 사용함으로써 객체지향적인 개념을 지키는 것이 AOP의 핵심 기능이다.
AOP는 아래와 같은 상황에 적용된다.
메서드 성능 검사, 트랜잭션 처리, 예외 반환 등
Spring에서 알아야 할 AOP 용어는 아래와 같다.
- Target : 부가기능을 부여할 대상. 핵심 기능을 담고 있는 모듈.
- Advice : 어느 시점에 어떤 Aspect를 적용할 지 정의한 것.
- JoinPoint : Aspect가 적용될 수 있는 지점. Target이 구현한 모든 메서드는 JoinPoint
- PointCut : Aspect가 적용될 JoinPoint
- Aspect(Advice + PointCut) : 여러 객체에서 적용되는 공통 관심 사항. Singleton 형태
- Advisor(Advice + PointCut) : Spring에서만 사용되는 Aspect의 특별한 용어.
- Weaving : PointCut에 Advice를 삽입하는 과정.
PointCut 표현식은 아래와 같다.
Execution 표현식은 아래와 같다.
Execution 표현식의 예시는 아래와 같다.
<aop:pointcut id="pointCut" expression="execution(public * entity.Person.*(..))>"
이는 entity 패키지에 있는 Person 클래스의 접근 제한자가 public인 모든 메서드를 의미한다.
package에서 .은 해당 package만, ..은 해당 package와 하위 package까지 가리킨다.
class에서 +는 해당 class를 구현한 자식 class를 가리킨다.
method .. 은 매개변수에 영향을 받지 않고 모든 method를 가리킨다.
기존 프로그래밍과 AOP 프로그래밍의 차이는 아래와 같다.
Spring에서 사용하는 AOP의 특징은 아래와 같다.
- Proxy 기반 AOP
Proxy는 Advice를 Target 객체에 적용하면서 생성되는 객체이다.
따라서 Proxy는 런타임에 생성된다.
- Intercept (Proxy가 호출을 가로챔)
(전처리 Advice)
Proxy는 Target 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행한다.
그 후, Target의 핵심기능 로직을 호출한다.
(후처리 Advice)
또는 Target의 핵심기능 로직을 호출한 후 Advice의 부가기능 로직을 수행한다.
- method JoinPoint만 지원
Target의 Method가 호출되는 Runtime에만 Advice를 적용할 수 있다.