[Spring] 입문-8. AOP

Jina·2023년 6월 21일
0

Spring

목록 보기
8/9

다음의 모든 내용은 김영한님의 스프링 입문 강의에서 가져온 것임을 밝힙니다.


📍 AOP가 필요한 상황

모든 메소드의 호출 시간을 출력해야 한다면?
=> 모든 메소드에 하나하나 호출시간 초 단위 로직을 넣었는데… 이번엔 밀리 세컨드로 바꿔야한다... (#°Д°)

이러한 호출 시간은 핵심 관심사항이 아닌, 공통 관심사항이다.

모든 메소드에 하나하나 시간측정 로직을 붙인다면, 변경시 하나하나 변경해야 하며 유지보수가 매우 어려워진다.


📍 AOP 적용

AOP는 공통 관심사항과 핵심 관심사항을 분리하는 기술! 시간 측정 로직을 따로 만들고, 이를 원하는 곳에 적용시키면 된다.

결과적으로 핵심 관심사항을 깔끔하게 유지할 수 있다!

1. TimeTraceAop

hello.hellospring 하위로 aop 디렉토리를 만들어, TimeTraceAop 클래스를 만들어주었다.

AOP는 @Aspect 애노테이션을 붙여주어야 한다.

  • TimeTraceAop.java
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect //AOP
@Component   //AOP는 컴포넌트 스캔 방식보다는, 직접 등록하는 것이 좋다.
public class TimeTraceAop {
    
    //이 AOP를 적용할 곳을 타겟팅 함. 다음은 hello.hellospring 하위의 모든 곳에 적용하는 것
    @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");
        }
    }
}

2. 실행

실행해보면, 메소드가 불릴 때마다 시간이 측정되는 모습이다.

3. 동작 원리

  • AOP 적용 전 의존관계
    Controller가 Service를 바로 호출한다.

  • AOP 적용 후 의존관계
    Controller는 가짜 Service(프록시)를 호출하게 된다.

0개의 댓글