AOP - 적용

박찬우·2024년 2월 16일
0

스프링

목록 보기
60/88

애스펙트

@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);
    }
}

결과

profile
진짜 개발자가 되어보자

0개의 댓글