AOP는 핵심기능과 부가기능(횡단관심사)를 분리해서 관리하는 것
@Aspect
public class AspectPractice {
/**
* 포인트컷 : 서비스 패키지 기반
*/
@Pointcut("execution(* com.standard.sparta.service..*(..))")
private void serviceLayer() {}
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackTime {
}
/**
* 어드바이스: 가장 강력한 어드바이저, 전체 흐름을 제어할 수 있습니다.
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("serviceLayer()") // 어노테이션 기반으로 포인트컷 설정
public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("::: BEFORE :::");
try {
Object result = joinPoint.proceed();
System.out.println(result);
log.info("::: AFTER RETURNING :::");
return result;
} catch (Exception e) {
log.info("::: AFTER THROWING :::");
throw e;
} finally {
log.info("::: AFTER :::");
}
}