ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인트컷, 어드바이스, 어드바이저
    스프링/스프링 AOP 2023. 9. 17. 16:41

    포인트컷 : 어디에 부가 기능을 적용할지, 안할지 판단하는 필터링 로직

    어드바이스 : 이전 포스팅에서 본 것처럼 프록시가 호출하는 부가 기능. 단순하게 프록시 로직

    어드바이저 : 포인트컷, 어드바이스를 하나씩 가지고 있는 것

     

    포인트 컷은 Service 클래스 안에 로직이 여러개가 있는데, 어떤 로직에 기능을 적용할 지 필터링 하는 것이며, 어드바이스는 프록시 로직을 의미한다.

     

     

    전체적인 예제 테스트 코드

    @Test
    void advisorTest1() {
        ServiceInterface target = new ServiceImpl();
        ProxyFactory proxyFactory = new ProxyFactory(target);
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(Pointcut.TRUE, new TimeAdvice());
        // 포인트 컷이 항상 참
        proxyFactory.addAdvisor(advisor);
        ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
    
        proxy.save();
        proxy.find();
    }

    어드바이저는 DefaultPointcutAdvisor를 생성자로 만들어서 사용한다. Pointcut.TRUE는 모든 로직을 true로 사용한다는 것이고, 어드바이스는 이전에 만들었던 TimeAdvice()를 넣어줬다.

    어드바이저는 포인트컷과 어드바이스를 하나씩 가지고 있는 것이다.

     

    이전 포스팅에 proxyFactory.addAdvisor()에 advisor가 아니라 new TimeAdvie()를 넣었는데, 어드바이저가 아닌 하나의 어드바이스를 넣으면 포인트컷은 default 값인 true인 어드바이저가 자동으로 들어가게 되는 것이다.

     

     

     

    포인트컷

    어드바이스는 이전 포스팅에서 다뤘지만 포인트컷은 다뤄본 적이 없기 때문에 여기서 설명한다.

    @Test
    void advisorTest2() {
        ServiceInterface target = new ServiceImpl();
        ProxyFactory proxyFactory = new ProxyFactory(target);
        NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
        pointcut.setMappedName("save"); // 메서드 이름이 save인 경우에만 부가 로직 수행
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, new TimeAdvice());
        proxyFactory.addAdvisor(advisor);
        ServiceInterface proxy = (ServiceInterface) proxyFactory.getProxy();
    
        proxy.save();
        proxy.find();
    }

    스프링에서 제공하는 포인트컷인 NameMatchMethodPointcut()을 사용하면 된다. 생성자를 생성한 이후에 pointcut.setMappedName()의 파라미터에 메서드 이름을 넣어주면 된다. 위의 코드에서는 save를 넣어줬기 때문에 save 메서드만 부가 로직이 수행된다.

    위의 사진을 보면 save가 호출될 때에는 프록시가 실행되었지만 setMappedName에 파라미터로 넘겨주지 않은 find는 프록시가 실행되지 않았다.

     

     

    스프링에서 제공하는 포인트컷이 많지만 가장 많이 사용하는건 aspectJ 표현식이라고 한다. aspectJ 표현식을 기반으로 사용하는 AspectJExpressionPointcut에 대해서는 추후에 자세하게 공부할 예정이다.

Designed by Tistory.