1. Spring AOP의 구현 방식
01.XML 기반의 POJO클래스를 이용한 AOP 구현
-부가기능을 제공하는 Advice 클래스를 작성한다.
-XML설정 파일에 <aop:config>를 이용해서 애스펙트를 설정한다.
(즉,어드바이스와 포인트 컷을 설정함)
02.@Aspect 어노테이션을 이용한 AOP구현
-@Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다.
이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.
-XML 설정파일에 <aop:aspectj-autoproxy /> 를 설정한다.
2. Advice의 종류
Around Advice |
타켓의 메서드가 호출되기 이전 (before)시점과 이후 (after)시점에 모두 처리해야 할 필요가 있는 부가기능을 정의한다. ->JoinPoint 앞과 뒤에서 실행되는 Advice |
Before Advice |
타겟의 메서드가 실행되기 이전(before) 시점에 처리해야 할 필요가 있는 부가기능을 정의한다. ->JoinPoint 앞에서 실행되는 Advice |
After Returning Advice |
타겟의 메서드가 정상적으로 실행된 이후(after)시점에 처리해야 할 필요가 있는 부가기능을 정의한다. ->JoinPoint 메서드 호출이 정상적으로 종료된 뒤에 실행되는 Advice |
After Throwing Adviced |
타겟의 메서드가 예외를 발생된 이후(after)시점에 처리해야 할 필요가 있는 부가기능을 정의한다 . ->예외가 던져질때 실행되는 Advice |
3. JoinPoint 인터페이스
JoinPoint는 Spring AOP 혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.
해당 지점을 AspectJ 에서 JoinPoint라는 인터페이스로 나타낸다.
JoinPoint 인터페이스는
getArgs() (메서드 아규먼트를 반환한다),
getThis() : 프록시 객체를 반환한다.
getTarget() : 대상객체를 반환한다 ,
getSignature() : 어드바이즈 되는 메서드의 설명(description)을 반환한다,
toString() : 어드바이즈 되는 메서드의 설명을 출력한다.
와 같은 유용한 메서드 제공
모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언할 수 있다.
Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 선언해야 한다.
4. AOP 설정
<aop:config> : AOP설정 정보임을 나타냄
<aop:aspect>: 애스펙트를 설정함
<aop:around pointcut="execution()">: Around 어드바이스와 포인트컷을 설정한다.
ex)
<aop:config>
<aop:aspect id="traceAspect" ref="performanceTraceAdvice">
<aop:around pointcut="execution(public * myspring.user.service...*(...))" methodd="trace" />
</aop:aspect>
</aop:config>
5. Advice를 정의하는 태그
각 타입의 Advice를 정의하기 위해 아래와 같은 태그를 제공한다
<aop:before> | 메서드가 실행 전에 적용되는 어드바이스를 정의한다. |
<aop:after-returning> | 메서드가 정상적으로 실행된 후에 적용되는 어드바이스를 정의한다. |
<aop:after-throwing> | 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다. try-catch 블록에서 catch 블록과 비슷하다. |
<aop:after> |
메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다. try-catch-finally에서 finally 블록과 비슷하다. |
<aop:around> | 메서드 호출 이전,이후.예외발생 등 모든 시점에 적용 가능한 어드바이스를 정의한다. |
6. PointCut 표현식 문법
AspectJ 포인트컷 표현식은 포인트컷 지시자를 이용하여 작성한다.
포인트컷 지시자 중에서 가장 대표적으로 사용되는 것은 execution()이다.
execution()지시자를 사용한 포인트컷 표현식의 문법구조는 다음과 같다.

7. PointCut 표현식 예시

01.execution(*hello(..))
hello라는 이름을 가진 메서드를 선정하는 것이다.
파라미터는 모든 종류를 다 허용한다.
02.execution(*hello())
파라미터 패턴이 () 로 되어 있으니 hello 메서드 중에서 파라미터가 없는 것만 선택한다.
03.execution(*myspring.user.service.UserServiceImpl.*(..))
myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 이 클래스가 가진 모든 메서드를 선택한다.
04.execution(*myspring.user.service.*.*(..))
myspring.user.service 패키지의 모든 클래스에 적용된다.
하지만 서브패키지의 클래스는 포함되지 않는다.
05.execution(*myspring.user.service..*.*(..))
myspring.user.service 패키지의 모든 클래스에 적용된다.
그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함된다.
06.execution(* *..Target.*(..))
패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용된다.
다른 패키지에 같은 이ㅡㄻ의 클래스가 있어도 적용이 된다는 점에 유의해야 한다.
'프레임워크 > Spring' 카테고리의 다른 글
Mybatis (0) | 2020.01.14 |
---|---|
AOP(3) (0) | 2020.01.13 |
AOP(Aspect Oriented Progamming) (0) | 2020.01.11 |
사용자관리 프로젝트 (0) | 2020.01.08 |
Bean 등록 메타정보 구성 전략 및 어노테이션 (0) | 2020.01.08 |