[Spring Framework] 19강 - PointCut 표현식과 Advisor 구현

seb Incode·2022년 4월 26일
0

Spring Framework

목록 보기
19/22
post-thumbnail

학습 내용

  • PointCut 표현식
  • @Aspect 어노테이션

학습 목표

  • 포인트컷 문법을 이해하고 구현한다.
  • @Aspect 어노테이션을 이용해 다양한 Advice를 구현할 수 있다.

PointCut 표현식

PointCut 표현식 문법

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

실제 어드바이스를 적용할 문법입니다.

PointCut 표현식 예시


  • hello라는 이름을 가진 메서드를 선정하는 것이다.
  • 파라미터는 모든 종류를 허용한다.
  • 파라미터 패턴이 '()'로 되어 있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.
  • myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택한다.
  • myspring.user.service 패키지의 모든 클래스에 적용된다. 하지만 서브패키지의 클래스는 포함되지 않는다.
  • myspring.ser.servcie 패키지의 모든 클래스에 적용된다. 그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.
  • 패키지에 상관없이 Taget이라는 모든 클래스에 적용된다. 다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야 한다.

Spring AOP 구현 - @Aspect

Spring AOP의 구현 방식

  1. XML 기반의 POJO 클래스를 이용한 AOP 구현
    • 부가기능을 제공하는 Advice 클래스를 작성함
    • XML 설정 파일에 < aop:config>를 이용해서 애스펙트를 설정함(즉, 어드바이스와 포인트컷을 설정함)
  2. @Aspect 어노테이션을 이용한 AOP 구현
    • @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다. 이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함함
    • XML 설정 파일에 < aop:aspectj-autoproxy />를 설정함

Spring에서 AOP를 구현하는 방식은 2가지가 있습니다.

@Aspect 어노테이션

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

Advice의 종류

Advice를 정의하는 어노테이션

  • Advice를 정의하기 위하여 아래와 같은 어노테이션을 제공함

JoinPoint 인터페이스

  • AOP가 적용되는 지점
  • 주요 메서드
    - getArgs() (메서드 아규먼트를 반환한다)
    • getThis() (프록시 객체를 반환한다)
    • getTarget() (대상 객체를 반환한다)
    • getSignature() (어드바이즈 되는 메서드의 설정(description)을 반환한다)
    • toString() (어드바이즈 되는 메서드의 설명을 출력한다)
  • 모든 어드바이스는 org.aspectj.lang.JointPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언할 수 있음
  • Around 어드바이스는 JointPoint의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 함

어드바이스가 실행될 지점, 즉 타겟 메소드 정보를 알 수 있는 여러가지 함수들입니다.
특히 getSignature()는 타겟 메소드의 이름, 파라미터 목록, 리턴 타입 등을 알 수 있는 메서드입니다.

실습

1. 메소드 수행시간 확인 Aspect 생성

0개의 댓글