Spring AOP - @AOP

Spring AOP - @AOP

백기선님의 강의인 Spring 프레임워크 핵심 기술 편의 AOP를 학습한 내용을 정리한 글

애노테이션 기반의 스프링 @AOP

애노테이션으로 AOP를 구현해보자

이전 시간에 배웠던 AdvicePointcut에 대해 복습해보자

Advice해야할 일을 의미한다.

Pointcut어디에 적용되는지를 의미한다.

@Component
@Aspect
public class PerfAspect{

  @Around("execution(* com.example..*.EventService.*(..))") // com.example 패키지 아래에 있는 EventService 내부에 있는 모든 메소드에 이 행위를 적용하라, 즉 Pointcut을 Around 어노테이션으로 적용
  public Object logPerf(ProceedingJoinPoint pjp throws Throwable{
      long begin = System.currentTimeMillis();
      Object retVal = pjp.proceed();
      System.out.println(System.currentTimeMillis()-begin);
      return retVal;
  }
}

위의 PerfAspect 클래스는 특정 패키지에 있는 특정 클래스의 모든 메소드가 실행될 때 Around 어노테이션으로 감싸진 메소드를 수행하게 되어있다.

그런데 만약 특정 메소드에만 AOP를 적용하고 싶은 경우라면 어떻게 해야할까?

가령 이전 코드에서 2개의 메소드가 있었는데 하나의 메소드에만 적용하고 싶은 경우라면?

이때는 Annotation을 직접 만들어서 해결 가능하다.

@Target(ElementType.METHOD)
public @interface PerLogging{
}

만든 어노테이션을 AOP를 적용할 메소드에 달아줄 것이다.

@Service
public class SimpleEventService implements EventService{

  @Overrride
  @PerLogging
  public void createEvent(){
    try{
      Thread.sleep(1000);
    } catch(InterruptedException e){
      e.printStackTrace();
    }
    System.out.println("Created an event");
  }

  @Overrride
  public void publishEvent(){
    try{
      Thread.sleep(2000);
    } catch(InterruptedException e){
      e.printStackTrace();
    }
    System.out.println("Published an event");
  }
}

createEvent() 메서드에만 시간을 측정하고 publishEvent() 메서드의 시간은 측정하지 않는다고 해보자.

@Component
@Aspect
public class PerfAspect{

  @Around("@annotation(PerLogging)")
  public Object logPerf(ProceedingJoinPoint pjp throws Throwable{
      long begin = System.currentTimeMillis();
      Object retVal = pjp.proceed();
      System.out.println(System.currentTimeMillis()-begin);
      return retVal;
  }
}

@Around 애노테이션에 PerLogging 애노테이션이 달려있는 메소드에만 AOP를 수행하라고 하면 createEvent() 메서드에만 적용이 된다.

이렇게 하면 다른 서비스에 적용하기가 매우 쉬울 것이다.

Spring AOP는 애노테이션 기반으로 하여 AOP를 구현하면 편하다.

Reference

인프런 백기선님의 스프링 프레임워크 핵심 기술 강좌



© 2022. by minkuk

Powered by minkuk