1 AOP가 필요한 상황
(1) AOP가 필요한 상황
- 언제? 여러개의 메소드에서 호출시간을 측정하고자 할 때
- 아래와 같은 방법으로 각각에 메소드에 시간을 찍어야 할까?
/* 회원가입 */
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");
}
}
(2) 문제정의
- 시간 측정 로직은 메소드들의 공통 관심 사항
- 시간 측정 로직과 비지니스 로직이 섞여 유지보수 어려움
- 시간 측정 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 함
2 AOP 적용
(1) AOP 적용
- 공통 관심 사항과 핵심 관심 사항 분리하기
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기
- 원하는 대상 선택 가능, 필요시 이 로직만 변경하면 됨
(2) 소스코드
- 컴포넌트 등록
@Bean
public TimeTraceApp timeTraceAop() {
/* SpringBin에 등록된 memberRepository를 요기 넣어줌 */
return new TimeTraceApp();
}
- TimeTraceAop 작성
@Aspect
@Component
public class TimeTraceApp {
/* 밑에 있는거 다 적용해 */
@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");
}
}
}