WEB/Spring

김영한 (스프링 부트 5)

Tony Lim 2021. 2. 8. 15:18
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