💎Spring AOP 특징
🔈Spring은 프록시(Proxy) 기반 AOP를 지원
- Spring은 대상 객체(Target Object)에 대한 프록시를 만들어 제공하며, 타겟을 감싸는 프록시는 Server Runtime 시에 생성된다. 이렇게 생성된 프록시는 대상 객체를 호출 할 때 먼저 호출되어 Advice의 로직을 처리 후 대상 객체를 호출한다.
🔈Proxy는 대상 객체의 호출을 가로챈다 (Intercept)
- Proxy는 그 역할에 따라 대상 객체에 대한 호출을 가로챈 다음,
Advice의 부가기능 로직을 수행하고 난 후에 타겟의 핵심기능 로직을 호출하거나 → 전처리 Advice
타겟의 핵심기능 로직 메소드를 호출 한 후에 Advice의 부가기능을 수행한다. → 후처리 Advice
🔈Spring AOP는 메소드는 조인 포인트만 지원
- Spring은 동적 프록시를 기반으로 AOP를 구현하기 때문에 메소드 조인포인트만 지원한다.
즉, 핵심기능(대상 객체)의 메소드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다.
💎Spring AOP 구현방식
🔈XML 기반의 aop 네임스페이스를 통한 AOP 구현
1) 부가기능을 제공하는 Advice 클래스를 작성한다.
2) XML 설정 파일에 <aop:config>를 이용해서 Aspect를 설정한다. (즉, 어드바이스와 포인트컷을 설정)
🔈@Aspect 어노테이션 기반의 AOP 구현
1) @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다.
(이 때, Aspect 클래스는 어드바이스를 구현하는 메소드와 포인트컷을 포함한다.)
2) dispatcher-servlet으로 지정된 XML 설정 파일에 <aop:aspect-autoproxy /> 를 설정한다.
📢 Spring AOP 구현 방식 - XML
- Advice를 정의하는 태그
📢 Spring AOP 구현 방식 - Annotation
- Advice를 정의하는 어노테이션
💎Advice
📢 Advice의 종류
1) Before Advice : 타켓의 메소드가 실행되기 이전 (before) 시점에 처리해야 할 필요가 있는 부가기능 정의
→ JoinPoint 앞에서 실행되는 Advice
2) Around Advice : 타겟의 메소드가 호출되기 이전 (before) 시점과 이후 (after) 시점에 모두 처리해야 할 필요 가 있는 부가기능 정의
→ JoinPoint 앞과 뒤에서 실행되는 Advice
3) After Returning : 타겟의 메소드가 정상적으로 실행된 이후 (after) 시점에 처리해야 할 필요가 있는 부가기능 정의
→ JoinPoint 메소드 호출이 정상적으로 종료된 뒤에 실행되는 Advice
4) After Throwing Advice : 타겟의 메소드세 예외가 발생된 이후 (after) 시점에 처리해야 할 필요가 있는 부가기능 정의
→ 예외가 던져질 때 실행되는 Advice
💎JoinPoint
📢 JoinPoint Interface
- JoinPoint는 Spring AOP 혹은 AspectJ에서 AOP의 부가기능을 지닌 코드가 적용되는 지점을 뜻하며, 모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메소드의 첫 번째 매개변수로 선언해야 한다
단, Around 어드바이스는 JoinPoint의 하위 타입인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 한다.
📢 JoinPoint Interface 메소드
1) getArgs() : 메소드의 매개 변수를 반환한다.
2) getThis() : 현재 사용 중인 프록시 객체를 반환한다.
3) getTarget() : 대상 객체를 반환한다.
4) getSignature() : 대상 객체 메소드의 설명(메소드 명, 리턴 타입 등)을 반환한다.
5) toString() : 대상 객체 메소도의 정보를 출력한다.
📢 Advice 예시