728x90
AOP
중간 중간에 중요한 비지니스 로직이아닌 일반적인 것들을 끼워 넣을 때 유용하다.
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
//@Component
public class TimeTraceAop
{
@Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)")
//@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable
{
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try
{
return joinPoint.proceed();
}
finally
{
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() +" " + timeMs + "ms");
}
}
}
이것을 적용할때 Component scan 방식을 이용하지않고 직접 Spring config 에 등록을 하면 unresolvable circular reference 순환참조오류가 발생하는 것을 확인할수 있다. 이것은 배제하기 위해 @Around 안의 범위지정을 다르게 해줘야 한다.
중간 중간에 intercepting해서 작용하는 방식이기에 ~조건이면 다음으로 넘어가지마 이런 것들 도 가능하다.
728x90
'WEB > Spring' 카테고리의 다른 글
김영한 (스프링 핵심원리 2) 스프링의 핵심원리이해 1 - 예제 만들기 (0) | 2021.02.09 |
---|---|
김영한 (스프링 핵심원리 1) 객체지향설계와 스프링 (0) | 2021.02.08 |
김영한 (스프링부트 입문) 4 (0) | 2021.02.08 |
김영한 (스프링부트 입문) 3 (1) | 2021.01.31 |
김영한 (스트링부트 입문) 2 (1) | 2021.01.24 |