[Spring Core] AOP - about Advice
[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만 있어도 모든 기능 수행이 가능하지만 타겟 등 고려해야 할 사항이 있을 경우 정상적으로 동작하지 않을 수 있음. 따라서 제약을 가지더라도 실수를 미연에 방지하고 역할을 명확하게 하기 위해 다른 기능을 활용하는 것이 좋음