PointCut 표현식

CHM·2022년 6월 24일
0

Spring

목록 보기
23/26
post-custom-banner

PointCut 표현식 문법

  • AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용해 작성
  • 가장 대표적 지시자 : execution()
    • execution() 문법
      : execution([접근제한자 패턴] 타입패턴 [타입패턴] 이름패턴 (타입패턴|"..",...)
    • execution() 예시
      execution(* aspects.trace.demo.*.*(..))
    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.service...*(..))
      : myspring.user.service 패키지의 모든 클래스에 적용된다. 그리고 '..'를 사용하여 서브패키지의 모든 클래스까지 포함한다.
    6. execution(* ..Target..(..))
      : 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용됨. 다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의

Spring AOP 구현방식(@Aspect)

1. XML 기반의 POJO 클래스를 이용한 AOP 구현

  • 부가기능을 제공하는 Advice 클래스를 작성함
  • XML 설정 파일에 <aop:config>를 이용해서 애스팩트를 설정(즉, 어드바이스와 포인트컷을 설정)

2. @Aspect 어노테이션을 이용한 AOP 구현

  • XML 설정파일에 <aop:aspectj-autoproxy/>를 설정
  • @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect클래스만 작성하면 된다.
  • 이 때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.

Aspect 어노테이션

  • Aspect 클래스 선언 시 @Aspect 어노테이션 사용
  • @Aspect 어노테이션을 사용할 경우 XML 설정 파일에 어드바이스와 포인트컷을 설정하는 것이 아니라 클래스 내부에 정의할 수 있음
  • <aop:aspectj-autoproxy> 태그를 설정파일에 추가하면 @Aspect 어노테이션이 적용된 Bean을 Aspect로 사용 가능함

Advice의 종류

  • 타깃에 부가기능(advice)를 실행하기 전, 후 or 앞뒤에 모두 적용할 것인지 등을 결정하는 것
  1. Around 어드바이스 : Joinpoint 앞, 뒤에 실행되는 Advice
  2. Before 어드바이스 : Joinpoint 앞에 실행되는 Advice
  3. After Returning 어드바이스 : Joinpoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice
  4. After Throwing 어드바이스 : 예외가 던져질 때 실행되는 Advice

Advice를 정의하는 어노테이션

  • Advice를 정의하기 위하여 아래 어노테이션 제공

Before("pointcut")

  • 타깃 객체의 메서드가 실행되기 전에 호출
  • Joinpoint를 통해 파라미터 정보 참조 가능

After("pointcut")

  • 타깃 객체의 메서드가 정상 종료됐을 때와 예외가 발생했을 때 모두 호출하는 어드바이스
  • 리턴겂이나 예외를 직접 전달받을 수는 없음

Arount("pointcut")

  • 타깃 객체의 메서드가 호출되는 전 과정을 모두 담을 수 있는 가장 강력한 기능을 가진 어드바이스
post-custom-banner

0개의 댓글