aspect oriented programming(관점 지향 프로그래밍)
공통 관심 사항과 핵심 관심 사항을 분리한다.
만약 내가 모든 로직에서 실행 시간을 측정하고 싶다고 한다면, 모든 컨트롤러에 시간 측정 로직을 달아줘야 할까?
AOP를 사용하면 된다.
시간 측정 로직을 만들어 놓고 이곳저곳 적용하면 된다.
스프링은 AOP기술을 편리하게 사용할 수 있도록 한다.
aop패키지를 만들고 AOP클래스를 만든다.
이 때 @Aspect 어노테이션을 붙인다.
그리고 이 aop를 스프링 빈으로 등록해야 한다.
@Component를 이용해 컴포넌트 스캔해도 되고,
이처럼 configuration설정해둬도 된다.
(예시에서는 컴포넌트 스캔 방식 사용)
@Around 어노테이션으로 이 로직을 어디어디에 적용할지 설정할 수 있다.
패키지 하위에 모두 적용할 수도 있고, 클래스별 적용도 가능하다
아래처럼 결과 확인
AOP를 사용해서 이런 조건이면 다음으로 넘어가지 마라! <<이런 것도 가능!
원래 의존관계가 이 상태였는데
AOP를 적용하고 어디에 적용할지 지정하게 되면
스프링은 가짜 memberService(프록시)를 만들어낸다. 이 가짜 스프링 빈이 끝나면
joinPoint.proceed()하고나서 진짜가 호출된다.
확인하려면 직접 찍어보면 됨
getClass로 찍어보면,
memberService로 끝나지 않고 뒤에 뭐가 붙는다
--> memberService를 복제해서 코드를 조작하는 기술!
(자세한 내용은 나중에 정리!)