Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.
ex) 모든 메서드의 호출시간을 측정하고싶을때
공통관심사항 vs 핵심 관심 사항이 구분된다.
회원 가입 시간, 회원 조회 시간을 측정하고 싶을때
만약 하나의 로직을 수정해야한다면?? 모든걸 다 들어가서 메서드들을 수정해줘야 한다.
예를들어서, join 메서드의 시간을 측정하고싶으면 이렇게 작성하면된다
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");
}
}
공통 관심 사항과 핵심 관심 사항을 분리한다.
이전 그림과는 다르게 AOP를 이용하여 로직을 따로 작성하여 적용
AOP는 @Aspect
애노테이션을 클래스에 적용시켜야 사용 가능
aop/TimeTraceAop안에 작성
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
@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(); // proceed하면 다음 메서드로 진행
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("End: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
@Bean //SpringConfig에 스프링 빈 등록 // 그냥 TimeTraceAop에 컴포넌트 애노테이션 하나 넣는걸로 해도 된다.
public TimeTraceAop timeTraceAop(){
return new TimeTraceAop();
}
해결
AOP동작 방식 설명
AOP적용 전 의존관계
AOP 적용 후 의존관계