어드바이스(Advice)
- Aspect를 언제 핵심 코드에 적용할지를 정의합니다.
- 부가 기능에 해당됩니다.
- 특정 조인 포인트에서 애스팩트에 의해 취해지는 조치입니다.
- 순서를 지정하고 싶으면 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애너테이션을 적용해야 합니다.
- 어드바이스 단위가 아니라 클래스 단위로 적용할 수 있습니다.
- 하나의 애스펙트에 여러 어드바이스가 존재하면 순서를 보장 받을 수 없습니다.
- 애스펙트를 별도의 클래스로 분리해야 합니다.
@Before("hello.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinPoint.getSignature()); }
@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result") public void doReturn(JoinPoint joinPoint, Object result) { log.info("[return] {} return={}", joinPoint.getSignature(), result); }
@AfterThrowing(value = "hello.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex") public void doThrowing(JoinPoint joinPoint, Exception ex) { log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage()); }
@Around만 있어도 모든 기능 수행이 가능
가장 강력한 어드바이스이며 대부분의 기능을 제공하지만 타겟 등 고려해야할 사항이 있을 때 정상적으로 작동이 되지 않는 경우가 있습니다.@Before, @After와 같은 어드바이스는 기능은 적지만 원하는대로 작동되고 코드도 단순합니다.
각 애너테이션만 봐도 타겟 실행 전에 어떤 일을 하는지 명확하게 알 수 있습니다.
좋은 설계는 @Around만 사용해서 모두 해결하는 것보다는 제약을 가지더라도 실수를 미연에 방지하는 것입니다.
제약을 두면 문제 자체가 발생하지 않게 하며, 역할이 명확해집니다.