오봉이와 함께하는 개발 블로그

스프링 핵심 원리 - 고급편 > 스프링이 제공하는 포인트컷 본문

BE/Spring

스프링 핵심 원리 - 고급편 > 스프링이 제공하는 포인트컷

오봉봉이 2024. 10. 3. 22:45
728x90

스프링 핵심 원리 - 고급편 > 스프링이 제공하는 포인트컷

사실 스프링에서 우리가 필요한 포인트컷의 대부분을 이미 제공한다.
이번에는 스프링이 제공하는 NameMatchMethodPointcut을 사용해서 구현해보자

  @Test
  void advisorTest3() {
    ServiceImpl target = new ServiceImpl();
    ProxyFactory proxyFactory = new ProxyFactory(target);
    NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
    pointcut.setMappedName("save");
    DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, new TimeAdvice());
    proxyFactory.addAdvisor(advisor);
    ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();

    proxy.save();
    proxy.find();
  }

NameMatchMethodPointcut 사용 코드

NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
pointcut.setMappedName("save");

NameMatchMethodPointcut을 생성하고 setMappedName()을 통해 메서드 이름을 지정하면 포인트컷이 완성된다.

실행 결과

22:34:54.668 [main] INFO hello.proxy.common.advice.TimeAdvice - Time Proxy Execute
22:34:54.669 [main] INFO hello.proxy.common.service.ServiceImpl - call save
22:34:54.669 [main] INFO hello.proxy.common.advice.TimeAdvice - Time Proxy Shutdown resultTime = 0
22:34:54.669 [main] INFO hello.proxy.common.service.ServiceImpl - call find

실행 결과를 보면 save()를 호출할 때는 어드바이스가 적용되지만, find()를 호출할 때는 어드바이스가 적용되지 않는다.

스프링이 제공하는 포인트컷

스프링은 무수히 많은 포인트컷을 제공한다지만, 몇가지 예시만 보자

  • NameMatchMethodPointcut: 메서드 이름을 기반으로 매칭한다. 내부에서는 PatternMatchUtils 를 사용한다.
    • 예: *xxx* 허용
  • JdkRegexpMethodPointcut: JDK 정규 표현식을 기반으로 포인트컷을 매칭한다.
  • TruePointcut: 항상 참을 반환한다. AnnotationMatchingPointcut : 애노테이션으로 매칭한다.
  • AspectJExpressionPointcut: aspectJ 표현식으로 매칭한다.

가장 중요한 것은 aspectJ 표현식
여기에서 사실 다른 것은 중요하지 않다.
실무에서는 사용하기도 편리하고 기능도 가장 많은 aspectJ 표현식을 기반으 로 사용하는 AspectJExpressionPointcut을 사용하게 된다. aspectJ 표현식과 사용방법은 중요해서 이후 AOP를 설명할 때 자세히 나온다.
지금은 Pointcut의 동작 방식과 전체 구조에 집중하자.

출처: 김영한 지식공유자의 스프링 핵심 원리 고급편

728x90
Comments