본문 바로가기

Spring/Spring

(SPRING) 스프링 AOP : 애노테이션 기반 AOP

의존성추가

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>


Advice와 Pointcut 정의 (기존의 Proxy 클래스 제거)

@Component
@Aspect
public class PerfAspect {

    @Around("execution(* me.choi..*.EventService.*(..))")
    public Object lofPerf(ProceedingJoinPoint pjp) throws Throwable {
        long begin = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        System.out.println(System.currentTimeMillis()-begin);

        return retVal;
    }
}

@Aspect : 해당 클래스가 Aspect 임을 정의 (Aspect: 하나의 모듈)

 

해야할 일(Advice), 해야할 일을 어디에 적용할 것인가(PointCut)?

ProceedingJoinPoint :  Advice가 적용이 되는 대상

@Around("PointCut이름 or PointCut 직접 정의") : 해당 Advice를 어떻게 적용할 것인가를 정의 

 

인텔리제이 같은 경우엔 위와 같이 해당 Aspect가 어디에 적용되는지 편하게 볼 수 있다.

 

 

더보기

execution 명시자

- Advice를 적용할 메서드 지정

 

- 기본 형식 :

-> "*" 는 모든 값을 의미

-> ".." 는 0개 이상 의미

 

 execution([수식어] [리턴타입] [클래스이름] [이름]([파라미터])


출처: https://groovysunday.tistory.com/201 [성냥의 불친절한 IT 이야기]

 

스프링(Spring) AOP : AspectJ Pointcut 표현식 (1-1) execution

execution 명시자 - Advice를 적용할 메서드 지정 - 기본 형식 : -> "*" 는 모든 값을 의미 -> ".." 는 0개 이상 의미 execution([수식어] [리턴타입] [클래스이름] [이름]([파라미터]) 수식어 - 생략가능 - publi..

groovysunday.tistory.com

 


문제점

위와 같이 Delete는 성능을 측정하고 싶지 않았지만 나와버렸다...

 

Annotation 적용

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PerfLogging {
}

 

적용될 메서드에 애노테이션 적용

 

이전 @Around(excution) 말고 만들었던 애노테이션을 적용하자

@Component
@Aspect
public class PerfAspect {

    //@Around("execution(* me.choi..*.EventService.*(..))")
    @Around("@annotation(PerfLogging)")
    public Object lofPerf(ProceedingJoinPoint pjp) throws Throwable {
        long begin = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        System.out.println(System.currentTimeMillis()-begin);

        return retVal;
    }
}

결과

 Delete에는 이제 성능측정을 하지 않는다!!!


기타 방법 (@Before, @Around(bean("")))

    @Around("bean(simpleEventService)")
    public Object lofPerf(ProceedingJoinPoint pjp) throws Throwable {
        long begin = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        System.out.println(System.currentTimeMillis()-begin);

        return retVal;
    }

    @Before("bean(simpleEventService)")
    public void hello(){
        System.out.println("hello!!");
    }

@Around를 위의 애노테이션 말고 bean으로 설정할수있다.

-> 하지만 해당 빈의 모든 메서드에 적용된다는 점에 유의하자!

 

@Before를 사용하면

해당 빈이 사용되기 이전에 실행되게끔 도와준다.


코드참고

https://github.com/mike6321/Spring/tree/master/Spring/AOP

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com