AOP
AOP 가 필요한 상황
- 모든 메서드의 호출 시간을 측정하고 싶다면?
- 공통 관심 사항 (cross-cutting concern) vs 핵심 관심 사항 (core concern)
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
testMethod();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println(timeMs);
}
}
문제
- 시간 측정 기능은 핵심 관심 사항이 아니다.
- 시간을 측정하는 로직은 공통 관심 사항
- 시간 측정 로직과 핵심 비즈니스 로직이 섞여서 유지보수가 어렵다.
- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아서 변경해야 한다.
AOP 적용
AOP Aspect Oriented Programming
- 공통 관심 사항 (cross-cutting concern) vs 핵심 관심 사항 (core concern) 분리
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* nosleepcoders.holeinonejdbc..*(..))")
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");
}
}
}