Web/spring-boot

[Spring] AOP @AfterReturing 사용해보기

부에나온다 2022. 10. 26. 09:06

     - Advice는 실질적으로 프록시에서 수행하게 되는 로직을 정의하게 되는 곳입니다.
        스프링에서는 Advice에 관련된 5가지 애노테이션을 제공합니다.
        어노테이션은 메서드에 붙이게 되는데 해당 메서드는 advice의 로직을 정의하게 되고, 어노테이션의 종류에 따라 

         포인트컷에 지정된 대상 메서드에서 Advice가 실행되는 시점 을 정할 수 있습니다.
        또한 속성값으로 Pointcut을 지정 할 수 있습니다.

 

      @AfterReturning

  • 조인 포인트가 정상 완료 후 실행(실제 target 메서드 수행 완료 후 실행)
  • 반환값 자체는 조작 불가능
  • 반환값 내부에 setter같은 수정자가 있따면 내부값은 수정 가능

@AfterReturing은 조인 포인트가 정상적으로 실행되고 값을 반환할 때 실행됩니다.(타겟 메서드가 예외가 아닌 정상값을 반환할 때)

  @AfterReturning(value = "execution(* kr.co.lunasoft.smartstorecoreapi.feign..*(..))" + "&& @annotation(kr.co.lunasoft.smartstorecoreapi.common.GetApiRemaining)", returning = "response")
    public void getRemainingCount(JoinPoint jp, Response response) {
        MethodSignature signature = (MethodSignature) jp.getSignature();
        Method method = signature.getMethod();

        log.info("REQUEST [{}] --> Remaining Rate Limit : {}", method.getName(), response.headers().get("gncp-gw-ratelimit-remaining"));
    }

다른 애노테이션과 다르게 속성값으로 returning이 추가되었습니다.

포인트 컷은 어노테이션을 생성하여 해당 클래스안에 해당 어노테이션이 선언되어져있는 메서드에서만 수행하도록 했습니다.
이 부분에는 Target 메서드가 반환하는 변수명을 적어주고, advice 메서드의 인자로 변수명을 일치시켜준다면 해당 값을 가져와서 사용할 수 있습니다.
여기서 주의할점은 returning 값을 받는 인자의 타입이 해당 리턴 값의 부모타입 혹은 같은 타입이어야만 해당 Advice가 동작합니다.
타입이 부모 혹은 동일 타입이 아니라면 해당 Advice 자체가 동작하지 않으니 주의해야 합니다.