Info

[ Spring ] Spring AOP 특징 및 구현 방식 / Advice 작성

Mungwang 2023. 9. 5. 12:38

💎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 예시