Advice 클래스 작성

Advice 종류

Around 어드바이스

  • 타켓의 메서드가 호출되기 이전 시점과 이후 시점에 모두 처리해야할 필요가 있는 부가기능의 정의
  • joinpoint 앞과 뒤에서 실행되는 Advice

Before 어드바이스

  • 타겟의 메서드가 실행되기 이전 시점에 처리해야 할 필요가 있는 부가기능의 정의
  • joinpoint 앞에서 실행되는 Advice

After Returning 어드바이스

  • 타겟의 메서드가 정상적으로 실행된 이후 시점에 처리해야 할 필요가 있는 부가기능의 정의
  • joinpoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice

After Throwing 어드바이스

  • 타켓 메서드가 예외를 발생시킨 이후 시점에 처리해야할 필요가 있는 부가기능의 정의
  • 예외가 던져질 때 실행되는 Advice

Advice 클래스 정보

  • 클래스명 : PerformanceTraceAdvice.java
  • 클래스 기능 : 타겟 객체의 메서드 실행시간을 계산하여 출력
  • Advice 유형 : Around 어드바이스
  • 구현 메서드명 : trace(ProceedingJoinPoint joinPoint)

JoinPoint 인터페이스

  • Spring AOP 혹은 AspectJ 에서 AOP가 적용되는 지점
  • 해당 지점을 AspectJ 에서 JoinPoint 라는 인터페이스로 나타낸다.
  • getArgs() 메서드 아규먼트 반환, getThis() 프록시객체 반환, getTarget() 대상 객체를 반환, getSignature() 어드바이즈 되는 메서드의 설명 반환, toString() 어드바이즈 되는 메서드의 설명 출력 과같은 다수의 유용한 메서드를 제공한다.
  • 모든 어드바이스에서는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언할 수 있다.
  • Around 어드바이스는 JoinPoint 의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언

 


PerformanceTraceAdvice.java


AOP 설정 및 테스트

AOP 클래스를 Bean 으로 등록

작성한 Advice 클래스를 XML 설정파일에 Bean 으로 등록해야 한다.


AOP 네임스페이스 추가


AOP 설정

  • <aop:config> AOP 설정 정보임을 나타낸다
  • <aop:aspect> 애스펙트를 설정한다.
  • <aop:around pointcut="execution()"> Around 어드바이스와 포인트컷을 설정한다.

AOP 설정에 대한 설명

  • <aop:aspect> 태그의 ref 속성은 애스펙트로서 기능을 제공할 Bean을 설정할 때 사용
  • <aop:around> 태그의 pointcut 속성의 execution 지시자는 어드바이스를 적용할 패키지, 클래스, 메서드를 표현할 때 사용한다.
  • myspring.user.service 패키지 및 하위 패키지에 있는 모든 public 메서드를 포인트컷으로 설정하고 있다.
  • UserServiceImpl 의 public 메서드가 호출될 때 PerformanceTraceAdvice Bean의 trace() 메서드가 호출되도록 설정하고 있다.


Around Advice 와 AOP 설정 테스트

  • UserService Bean 메서드를 호출하면 , Aroun Advice 가 적용된 것을 확인할 수 있다.


Advice 를 정의하는 태그

<aop:before>

  • 메서드 실행 전에 적용되는 어드바이스의 정의ㅇ

<aop:after-retruning>

  • 메서드가 정상적으로 실행된 후 적용되는 어드바이스

<aop:after-throwing>

  • 메서드가 예외를 발생시킬 때 적용되는 어드바이스 정의
  • try-catch 블록에서 catch와 비슷하다.

<aop:after>

  • 메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의
  • try-catch-finally 에서 finally 블록과 비슷하다.

<aop:around>

  • 메서드 호출 이전, 이후, 예외 발생 등 모든 시점에 적용한 어드바이스를 정의

PointCut 표현식

PointCut 표현식 문법

  • AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성한다.
  • 포인트컷 지시자 중 가장 대표적으로 사용되는 것은 execution() 이다.
  • excution() 지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같다.


PointCut 표현식 예시

1. execution(* hello(..))

  • hello라는 이름을 가진 메서드를 선정하는 것이다.
  • 파라미터는 모든 종류를 허용

2. execution(* hello())

  • 파라미터 패턴이 ()로 되어 있으니 hello 메서드 중 파라미터가 없는 것만 선택한다.

3. execution(* myspring.user.service.UserServiceImpl.*(..))

  • myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택한다.

4. execution(* myspring.user.service.*.*(..))

  • myspring.user.service 패키지의 모든 클래스에 적용된다. 하지만 서브패키지의 클래스는 포함되지 않는다.

5. execution(* myspring.user.servicce..*.*(..))

  • myspring.user.service 패키지의 모든 클래스에 적용된다. 그리고 .. 을 사용하여 서브패키지의 모든 클래스까지 포함된다.

6. execution(* *..Target.*(..))

  • 패키지에 상관없이 Target 이라는 이름의 모든 클래스에 적용된다. 다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야 한다.

 

'Back-end > Spring' 카테고리의 다른 글

MyBatis 개요  (0) 2021.06.11
AOP 어플리케이션 작성(2) - Annotation  (0) 2021.06.11
AOP 개요  (0) 2021.06.11
Spring JDBC 환경설정  (0) 2021.06.11
Spring JDBC 개요  (0) 2021.06.11

+ Recent posts