Aspect Oriented Programming
hello\hellospring\aop\TimeTraceAop.java
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
// @Component 애너테이션을 사용해도 되지만 Aop가 등록해서 쓰이는구나 알 수 있게 직접 @Bean 등록해주는것이 좋음
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))") // 공통 관심사 타겟팅
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: * " + joinPoint.toString());
try{
Object result = joinPoint.proceed(); // 다음 메소드로 진행
return result;
}finally {
long finish=System.currentTimeMillis();
long timeMs=finish-start;
System.out.println("END: * " + joinPoint.toString()+ " "+timeMs+"ms");
}
}
}
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리
- 시간을 측정하는 로직을 별도의 공통 로직으로 생성
- 핵심 관심 사항을 깔끔하게 유지 가능
- 변경이 필요하면 이 로직만 변경하면 됨
- 원하는 적용 대상을 선택할 수 있음
1. Aop를 적용하고 어디에 사용할지 지정하면 가짜 멤버 서비스(프록시)를 만듦
2. 스프링 컨테이너에 등록 할 때 진짜 스프링 빈 말고 가짜 스프링 빈(프록시)를 앞에 세움
3. 가짜 스프링빈(프록시)가 끝나면 joinPoint.proceed()로 진짜 스프링 빈을 호출