목차
회원 조회 시간 측정 추가
public Long join(Member member) {
long start = System.currentTimeMillis(); //시작 시간 측정
try {
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
}finally {
long finish = System.currentTimeMillis(); // 종료 시간 측정
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms"); // 총 시간 = 종료 시간 - 시작 시간
}
}
// 회원가입 함수
<<문제점>>
1. 시간 측정은 핵심 로직이 아님(But 시간 측정 로직은 공통 사항)
2. 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수 어려움(별도의 공통 로직으로 만드는 것도 힘듬)
3. 시간 측정 로직을 변경할 때 모든 로직을 찾아서 변경해야 함
AOP 적용
@Component // @Bean으로도 등록 가능(선호)
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))") // 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");
}
}
}
//hello.hellospring.aop.TimeTraceAop.java
<<해결>>
AOP 동작 방식
<<기존 스프링 컨테이너>>
[컨트롤러 -> 서비스]
<<AOP 적용 후 의존 관계>>
[컨트롤러 -> 서비스(프록시) ->joinPoint.proceed()-> 서비스(실제)]