-
AOP(execution)Spring 2020. 1. 27. 19:20
사용자는 시스템을 사용하면서 자연스럽게 비즈니스 컴포넌트의 여러 Joinpoint를 호출하게 된다. 이때 특정 Pointcut으로 지정한 메소드가 호출되는 순간, 어드바이스 객체의 어드바이스 메소드가 실행.
어드바이스 메소드의 동작시점은 5가지로 지정 가능( Before,After,After-Returning,After-Throwing,Around),
포인트컷으로 지정한 메소드가 호출될 때, 어드바이스 메소드를 삽입하도록 하는 설정을 Aspect 라고 한다.
이 Aspect 설정에 따라 위빙이 처리된다.
<aop:config> : AOP 설정의 루트 엘리먼트, 여러번 사용가능 , 하위에는 <aop:pointcut> <aop:aspect> 엘리먼트 위치할수있다.
<aop:pointcut>엘리먼트는 포인트컷 지정을 위해 사용, aop:config의 자식이나 aop:aspect의 자식 엘리먼트로 사용가능,
그러나 aop:aspect 하위에 설정된 포인트컷의 경우 해당 aop:aspect에서만 사용가능.
<aop:aspect> : 핵심 관심에 해당하는 포인트컷 메소드와 횡단 관심에 해당하는 어드바이스 메소드를 결합하기 위해 사용한다.
<aop:advisor> : 포인트컷과 어드바이스를 결합한다는 점에서 aop:aspect 와 같은 기능. 하지만, 트랜잭션 같은 몇몇 특수한 경우는 애스팩트가 아닌 어드바이저를 사용해야 한다.
AOP 설정에서 애스팩트를 사용하려면 어드바이스의 아이디와 메소드 이름을 알아야 한다.
만약 어드바이스 객체의 아이디를 모르거나 메소드 이름을 확인할 수 없을 때는 애스팩트를 설정할 수 없다.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" raead-only="true">
</tx:attributes>
<aop:config>
<aop:pointcut id="allPointcut" expression="execution(* com.springbook.biz..*Impl.*(..))"
<aop:advisor pointcut="allPointcut" advice-ref="txAdvice"/>
</aop:config>
포인트컷 표현식
execution(리턴타입 / 패키지경로 / 클래스명 / 메소드명 매개변수 )
execution(* /com.springbook.biz../*Impl/.*(..))리턴타임
* : 모든 리턴타입 허용
void : 리턴타입이 void인 메소드 선택
!void : 리턴타입이 void가 아닌 메소드 선택
패키지경로
com.springbook.biz : 정확하게 이 패키지만 선택
com.springbook.biz.. : com.springbook.biz 로 시작하는 모든 패키지
com.springbook.biz..impl : com.springbook.biz로 시작하면서 impl로 끝나는 패키지 선택
클래스 지정
BoardServiceImpl : 정확하게 이 클래스만 선택
*Impl : 클래스 이름이 Impl 로 끝나는 클래스만 선택
BoardService+ : 클래스 이름 뒤에 '+'가 붙으면 해당 클래스로부터 파생된 모든 자식클래스선택
인터페이스의 경우 해당 인터페이스를 구현한 모든 클래스 선택
메소드 지정 (메소드를 지정할떄 주로 '*',매개변수를 지정할 때는 '..')
*(..) : 가장 기본 설정으로 모든 메소드 선택
get*(..) : 메소드 이름이 getㅇ로 시작하는 모든 메소드 선택
매개변수 지정
(..) : 가장 기본 설정으로 매개변수의 개수와 타입에 제약이 없음을 의미.
(*) : 반드시 1개의 매개변수를 가지는 메소드만 선택
(com.springbook.user.UserVO): 매개변수로 UserVO를 가지는 메소드만 선택.이때 클래스의 패키지 경로가 반드시 포함되어야함.
(!com.springbook.user.UserVO) :매개변수로 UserVO를 가지지 않는 메소드만 선택
(Integer, ..) 한개 이상의 매개변수를 가지되, 첫번째 매개변수의 타입이 Integer인 메소드만 선택
(integer, *) : 반드시 두개의 매개변수를 가지되,첫번째 매개변수 타입이 Integer인 메소드만 선택
'Spring' 카테고리의 다른 글
After Returning ,After Throwing ,Around (0) 2020.01.28 JoinPoint (0) 2020.01.28 AOP (0) 2020.01.27 Spring Annotation (0) 2020.01.22 Spring Setter (0) 2020.01.22