공부 자료/Spring

[Spring Core] AOP - about Advice

희희웃는청바지 2022. 10. 17. 13:37

[Advice 순서]

: 어드바이스는 기본적으로 순서를 보장하지 않음

>> 순서 지정을 할 경우 @Aspect 적용 단위로 org.springfamework.core.annotation.@Order 애너테이션 적용이 필요함

(어드바이스 단위가 아닌 클래스 단위로 적용이 가능하며, 하나의 애스펙트에 여러 어드바이스가 존재하면 순서 보장 불가)

: 애스펙트를 별도의 클래스로 분리해야 함

 

 

[Advice 종류]

1. Before

: 조인 포인트 실행 이전에 실행

: 타겟 메서드가 실행되기 전 처리해야 할 필요가 있는 부가 기능 호출 전 공통 기능을 실행

: Before Advice 구현한 메서드는 일반적으로 리턴타입이 void (리턴값을 갖더라도 Advice 적용 과정에 영향 없음)

: 작업 흐름 변경 불가

: 메서드 종료 시 자동으로 다음 타겟이 호출되나 예외가 발새될 경우 다음 코드는 호출되지 않음

 

2. After returning

: 조인 포인트가 정상 완료된 후 실행

: 메서드가 예외 없이 실행된 이후에 공통 기능 실행 (메서드 실행이 정상적으로 반환될 때 실행)

: returning 속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 하며, returning 절에 지정된 타입의 값을 반환하는 메서드만 대상을 실행

 

3. After throwing

: 메서드가 예외를 던져 종료될 때 실행

: 메서드를 실행하는 도중 예외가 발생한 경우 공통 기능을 실행

: throwing 속성에 사용된 이름은 어드바이스 메서드의 매개변수 이름과 일치해야 하며, throwing 절에 지정된 타입과 맞는 예외를 대상으로 실행

 

4. After (finally)

: 조인 포인트의 동작 (정상 또는 예외)과는 상관없이 실행 (예외 동작 finally 생각)

: 메서드 실행 후 공통 기능 실행

: 일반적으로 리소스 해제하는데 사용

 

5. Around

: 메서드 호출 전후에 수행하며 가장 강력한 어드바이스 (조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능)

: 메서드 실행 전/후, 예외 발생 시점에 공통 기능을 실행

가장 강력한 어드바이스 >> @Around만 있어도 모든 기능 수행 가능

 - 조인 포인트 실행 여부 선택 : joinPoint.proceed()

 - 전달 값 반환 : joinPoint.proceed(args[])

 - 반환 값 변환

 - 예외 변환

 - try~catch~finally 가 들어가는 구문 처리 가능

: 어드바이스의 첫 번째 파라미터는 ProceedingJoinPoint 사용해야 함

: proceed()를 통해 대상을 실행하며, 여러번 실행 가능함

 

* @Around만 있어도 모든 기능 수행이 가능하지만 타겟 등 고려해야 할 사항이 있을 경우 정상적으로 동작하지 않을 수 있음. 따라서 제약을 가지더라도 실수를 미연에 방지하고 역할을 명확하게 하기 위해 다른 기능을 활용하는 것이 좋음