
애스펙트
@Slf4j
@Aspect
public class AspectV1 {
@Around("execution(* hello.aop.order ..*(..))")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[log] {}", joinPoint.getSignature());
return joinPoint.proceed();
}
}
- @Around 애노테이션의 값인
execution(* hello.aop.order..*(..))
는 포인트컷이 된다.
- @Around 애노테이션의 메서드인 doLog 는 어드바이스( Advice )가 된다.
execution(* hello.aop.order..*(..))
는 hello.aop.order 패키지와 그 하위 패키지( .. )를 지
정하는 AspectJ 포인트컷 표현식이다.
- OrderService , OrderRepository 의 모든 메서드는 AOP 적용의 대상이 된다.
TEST
@Slf4j
@SpringBootTest
@Import(AspectV1.class)
public class AopTest {
@Autowired
OrderService orderService;
@Autowired
OrderRepository orderRepository;
@Test
void aopInfo() {
log.info("isAopProxy, orderService={}",
AopUtils.isAopProxy(orderService));
log.info("isAopProxy, orderRepository={}",
AopUtils.isAopProxy(orderRepository));
}
@Test
void success() {
orderService.orderItem("itemA");
}
@Test
void exception() {
assertThatThrownBy(() -> orderService.orderItem("ex"))
.isInstanceOf(IllegalStateException.class);
}
}

결과
