- PointCut 표현식
- @Aspect 어노테이션
- 포인트컷 문법을 이해하고 구현한다.
- @Aspect 어노테이션을 이용해 다양한 Advice를 구현할 수 있다.
- AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성함
- 포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution()임
- execution() 지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같음
실제 어드바이스를 적용할 문법입니다.
- hello라는 이름을 가진 메서드를 선정하는 것이다.
- 파라미터는 모든 종류를 허용한다.
- 파라미터 패턴이 '()'로 되어 있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.
- myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택한다.
- myspring.user.service 패키지의 모든 클래스에 적용된다. 하지만 서브패키지의 클래스는 포함되지 않는다.
- myspring.ser.servcie 패키지의 모든 클래스에 적용된다. 그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.
- 패키지에 상관없이 Taget이라는 모든 클래스에 적용된다. 다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야 한다.
- XML 기반의 POJO 클래스를 이용한 AOP 구현
- 부가기능을 제공하는 Advice 클래스를 작성함
- XML 설정 파일에 < aop:config>를 이용해서 애스펙트를 설정함(즉, 어드바이스와 포인트컷을 설정함)
- @Aspect 어노테이션을 이용한 AOP 구현
- @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다. 이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함함
- XML 설정 파일에 < aop:aspectj-autoproxy />를 설정함
Spring에서 AOP를 구현하는 방식은 2가지가 있습니다.
- Aspect 클래스 선언할 때 @Aspect 어노테이션을 사용함
- AspectJ 5버전에 새롭게 추가된 어노테이션임
- @Aspect 어노테이션을 이용할 경우 XML 설정 파일에 어드바이스와 포인트컷을 설정하는 것이 아니라 클래스 내부에 정의할 수 있음❕
- < aop:aspectj-autoproxy> 태그를 설정파일에 추가하면 @Aspect 어노테이션이 적용된 Bean을 Aspect로 사용 가능함
- Advice를 정의하기 위하여 아래와 같은 어노테이션을 제공함
- AOP가 적용되는 지점
- 주요 메서드
- getArgs() (메서드 아규먼트를 반환한다)
- getThis() (프록시 객체를 반환한다)
- getTarget() (대상 객체를 반환한다)
- getSignature() (어드바이즈 되는 메서드의 설정(description)을 반환한다)
- toString() (어드바이즈 되는 메서드의 설명을 출력한다)
- 모든 어드바이스는 org.aspectj.lang.JointPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언할 수 있음
- Around 어드바이스는 JointPoint의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 함
어드바이스가 실행될 지점, 즉 타겟 메소드 정보를 알 수 있는 여러가지 함수들입니다.
특히 getSignature()는 타겟 메소드의 이름, 파라미터 목록, 리턴 타입 등을 알 수 있는 메서드입니다.