[Spring AOP] - 포인트컷 참조
목차 [Spring AOP] - Advice 종류 [Spring AOP] - 트랜잭션 순서 [Spring AOP] - 포인트컷 참조 [Spring AOP] - 어드바이스 추가 [Spring AOP] - @Pointcut 포인트컷 분리 [Spring AOP] - @Aspect [Spring AOP] - Aspect [Spring AOP] - 용어 정리 [Spring AOP] - 적용 방식 Pointcutpublic class Pointcuts { @Pointcut("execution(* com.example.aop.order..*(..))") public void allOrder(){} // 클래스 이름 패턴이 *Service @Pointcut("execution(* *..*Service.*(..))") public void allService(){} // allOrder && allService @Pointcut("allOrder() && allService()") public void orderAndService(){}} 외부 Pointcut 참조@Slf4j@Aspectpublic class AspectV4PointCut { @Around("com.example.aop.order.aop.Pointcuts.allOrder()") public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("[log] {}", joinPoint.getSignature()); // join point 시그니처 return joinPoint.proceed(); } // com.example.aop.order 하위 패키지면서 클래스 이름 패턴이 *Service 인 것 @Around("com.example.aop.order.aop.Pointcuts.orderAndService()") public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable{ try{ log.info("[트랜잭션 시작] {}", joinPoint.getSignature()); Object result = joinPoint.proceed(); log.info("[트랜잭션 커밋] {}", joinPoint.getSignature()); return result; }catch (Exception ex){ log.info("[트랜잭션 롤백] {}", joinPoint.getSignature()); throw ex; }finally { log.info("[리소스 릴리즈] {}", joinPoint.getSignature()); } }} @Slf4j@SpringBootTest@Import(AspectV4PointCut.class)public class AopTest { @Autowired OrderService orderService; @Autowired OrderRepository orderRepository; @Test public void aopTest(){ log.info("isAopProxy, orderService = {}", AopUtils.isAopProxy(orderService)); log.info("isAopProxy, orderRepository = {}", AopUtils.isAopProxy(orderRepository)); } @Test public void success(){ orderService.orderItem("itemA"); } @Test public void exception(){ assertThatThrownBy(() -> orderService.orderItem("ex")) .isInstanceOf(IllegalStateException.class); }}