인프런 김영한님의 스프링 강의를 듣고 정리한 내용입니다. 출처
핵심 비지니스 로직을 가지는 핵심 관심 사항이 아닌 모든 메소드의 호출 시간 측정 같은 공통 관심 사항을 추가해야하는 경우
모든 메서드의 시작과 끝에 시간측정코드를 추가해줘야하는데 너무 많은 시간이 소요된다. 이런 경우 AOP가 필요하다.
AOP는 핵심 관심 사항과 공통 관리 사항을 분리해서 개발하는 기술이다.
위 사진처럼 시간측정같은 공통 관심 사항 같은 경우 각 메서드의 시작과 끝에 시간측정코드를 추가해주는 대신 AOP를 적용해서 시간측정코드를 분리해서 개발 할 수 있다.
예제
@Component
@Aspect
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 {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
"ms");
}
}
}
@Aspect
AOP 기능 사용하기위해서 필요
@Component
스프링 빈 등록 (보통 실무에서는 Config를 통해 등록하는방식을 사용)
@Around
공통 관심사항을 적용할곳 지정
AOP 적용 전 의존관계
AOP 적용 후 의존관계
AOP 적용시 memberController 에서 memberService를 호출할때 프록시 memberService가 호출되고 joinPoint.proceed()가 호출되면 실제 memberService가 호출된다.
AOP 적용 전 전체 그림
AOP 적용 후 전체 그림