AOP(2)

AOP(1)에서 AOP로 메서드에 포함된 값과 반환되는 값을 구현합니다.

AOP(2)에서 우리는 메서드의 실행 시간과 함께 서버의 로드 또는 상태를 기록하는 로그를 생성합니다.AOP를 만드는 것이 아니라 사용자 지정 주석을 만드는 것입니다.그리고 적절한 주석을 사용하여 주석이 설정된 메서드만 기록할 수 있습니다.


먼저 TimerAop를 만듭니다.이 aop는 특정 메소드의 실행 시간을 캡처하는 데 사용됩니다.

마찬가지로 @Aspect 및 @Component가 추가됩니다.

빈과 구성 요소의 차이점은 빈은 어떤 클래스에도 할당할 수 없다는 것입니다.

컴포넌트를 통해 클래스 단위로 Bean을 등록할 수 있으며 Bean은 메소드에서 사용되는 주석입니다.

구성은 클래스에 다른 빈을 등록하는 것으로 생각할 수 있습니다.

(참조 : https://mangkyu.75)

같은 방식으로 @Pointcut을 첨부했습니다.

enableTimer()도 메서드를 만들었습니다(이름은 의미 없음).


그리고 Timer라는 주석을 만들었습니다. 이 주석의 대상을 설정할 수 있습니다.

@Target({ElementType.TYPE, ElementType.METHOD})

두 가지를 목표로 할 수 있습니다. ElementType 및 Method가 설정됩니다.

그리고 Retention은 Runtime으로 설정되어 Runtime에서 실행됩니다.


그런 다음 RestApiController delete() 메서드를 만들었습니다. 로직이 db를 처리하는 데 1-2초가 걸린다고 가정합니다.

Thread.sleep(1000*2)으로 설정했습니다. 2초 후에 종료되도록 @DeleteMapping을 추가했습니다.

그리고 나만의 @Timer 주석을 추가했습니다. 그런 다음 TimerAop은 주석에 제한을 두어 Pointcut 외에도 타이머 역할을 할 수 있도록 합니다.


위의 코드는 첫 번째 포인트컷은 컨트롤러 아래의 메서드로 설정되고 두 번째 포인트컷은 타이머 주석이 설정된 메서드만 로깅해야 함을 의미합니다.


그러나 시간을 측정할 것이기 때문에 전후가 필요합니다. 비포 애프터 방식을 사용하면 시간을 공유할 수 없습니다. 그래서 우리는 Around 방법을 사용합니다. @Around 속성인 cut과 enableTimer를 함께 사용한다는 뜻이다. 그리고 around에는 joinpoint 매개변수가 있고 실행 방법은 간단합니다. joinPoint.proceed()가 호출되면 실제 메서드가 실행되고 반환 값이 있으면 객체 결과로 반환됩니다. Timer 방식은 Continue에서 실행되기 때문에 위에서 아래에서 시간을 측정할 수 있습니다. 상단에서 스톱워치(Spring에서 제공하는 클래스)를 시작하고 계속하고 아래에서 일시 중지합니다. 그리고 총 시간을 출력합니다.

메서드가 실행된 후 소요되는 시간을 확인할 수 있습니다.

물론 Aop를 사용하지 않고 코드에서 직접 스톱워치로 시간을 얻을 수 있습니다.

그러나 다른 방법에서 사용하기 위해서는 논리가 있어야 할 곳에 항상 추가 사항이 배치됩니다.

이것을 AOP로 만들고 관점 중심으로 만드는 것이 중요합니다.


RestApi에서 delete를 실행하면 시간을 설정하면 2초가 나오는 것을 볼 수 있다.

delete, return obj 및 null은 aop 매개 변수 및 return obj에 설정된 메서드 이름입니다.