다음의 모든 내용은 김영한님의 스프링 입문 강의에서 가져온 것임을 밝힙니다.
모든 메소드의 호출 시간을 출력해야 한다면?
=> 모든 메소드에 하나하나 호출시간 초 단위 로직을 넣었는데… 이번엔 밀리 세컨드로 바꿔야한다... (#°Д°)
이러한 호출 시간은 핵심 관심사항이 아닌, 공통 관심사항이다.
모든 메소드에 하나하나 시간측정 로직을 붙인다면, 변경시 하나하나 변경해야 하며 유지보수가 매우 어려워진다.
AOP는 공통 관심사항과 핵심 관심사항을 분리하는 기술! 시간 측정 로직을 따로 만들고, 이를 원하는 곳에 적용시키면 된다.
결과적으로 핵심 관심사항을 깔끔하게 유지할 수 있다!
hello.hellospring 하위로 aop 디렉토리를 만들어, TimeTraceAop
클래스를 만들어주었다.
AOP는
@Aspect
애노테이션을 붙여주어야 한다.
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 //AOP
@Component //AOP는 컴포넌트 스캔 방식보다는, 직접 등록하는 것이 좋다.
public class TimeTraceAop {
//이 AOP를 적용할 곳을 타겟팅 함. 다음은 hello.hellospring 하위의 모든 곳에 적용하는 것
@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");
}
}
}
실행해보면, 메소드가 불릴 때마다 시간이 측정되는 모습이다.
AOP 적용 전 의존관계
Controller가 Service를 바로 호출한다.
AOP 적용 후 의존관계
Controller는 가짜 Service(프록시)를 호출하게 된다.