문제
세상에 많은 개발자들이 저 위의 메서드를 고치는 것을 고민을 하였다.
AOP : Aspect Oriented Programming
공통 관심 사항과 핵심 관심 사항을 나눠서 생각을 해본다.,
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class TimeTraceAop {
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END : " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
@Aspect를 통해 AOP 등록해줌
component어노테이션을 직접 적어도 되는데 Bean 등록을 더 선호
https://programmingrecoding.tistory.com/13
SpringConfig
@Bean
public TimeTraceAop timeTraceAop() {
return new TimeTraceAop();
}
공통 관심사항을 적용하는 것
@Around
@Around("execution(* hello.hellospring..*(..))")
hellospring 패키지 밑에서 모든 것들이 적용이 된다.
해결
@Around("execution(* hello.hellospring.service..*(..))")
라고 명시하면 service패키지 내에 것만 적용이 된다.
컨트롤에서 서비스를 호출한다.
의존 관계를 호출 한다.
서비스에 AOP가 있으면 가짜 멤버 서비스를 만듭니다(프록시)
빈을 등록할때 가짜가 등록이 된다.
가짜가 끝이 나면
joinPoint.proceed()을 통해 진짜를 호출한다.
스프링 입문을 위한 자바 객체지향의 원리와 이해
AOP 적용을 다하면 다음과 같이 됩니다.
AOP 기술에는 가짜를 만들어서 해준다. 이게 DI가 해준다. 이런 점이 DI로 좋다.