능글맞은 구렁이
Spring-AOP(XML 기반) 본문
※주의※
XML방식을 사용하려면 AOP에 대한 Namespace가 반드시 있어야 한다. 위빙 작업까지 다 하려면 pom.xml에 aspectjweaver를 추가해줘야 한다.
1. <aop:config>엘리먼트
AOP설정에서 <aop:config>는 루트 엘리먼트이다. 스프링 설정 파일 내에서 <aop:config>는 중복 사용이
가능하며 하위에는 <aop:pointcut>, <aop:aspect> 엘리먼트가 위치할 수있다.
2. <aop:pointcut>엘리먼트
1) <aop:poincut~~/>은 여러 번 사용가능하며, <aop:aspect>의 하위에 설정할 수 있다.
단 , <aop:aspect>하위로 설정된 <aop:pointcut>은 <aop:aspect>에서만 사용할 수 있다.
2) <aop:pointcut>의 속성
ㄱ) id 속성="유일한 이름"(중복안됨)
ㄴ) expression속성="excution( )"
ㄷ) exction(리턴값(*) 패키지. 클래스명. 메서드명(..) )
(*Impl.*(..) : Impl로 끝나는 / Board*.get*(..):Board로 시작하는)
3. <aop:aspect>엘리먼트
<aop:aspect>는 핵심 관심에 해당하는 포인트컷 메소드와 횡단 관심에 해당하는 어드바이스 메소드를 결합하기
위해 사용한다. 애스팩트를 어떻게 설정하느냐에 따라서 위빙결과가 달라지므로 AOP에서 가장 중요한 설정이라
할 수 있다. 애스팩트의 경우 어드바이스 객체의 아이디를 모르거나 메소드 이름을 확인할 수없을 때는 사용할 수
없다.
1) 어드바이스 메서드실행 시점 설정 ,
2) 포인트컷 메서드와 어드바이스 메서드를 결합(주요목적) : 실행 시점 까지 정의 가능
3) ref="어드바이스객체"
4) <aop:실행시점(before/after) pointcut-ref="포인트컷id" method="어드바이스메서드명"/>
4. <aop:advisor>엘리먼트
포인트컷과 어드바이스를 결합한다는 점에서 애스팩트와 같은 기능을 한다. 하지만 트랜잭션 설정 같은 몇몇 특수한
경우에 사용하면 된다.
1)<aop:advisor>엘리먼트와 <aop:aspect>의 차이점*
ㄱ)<aop:aspect>는 객체의 아이디를 모르거나 메소드 이름을 확인할 수 없을때는 사용할 수 없다.
ㄴ)<aop:advisor>는 어드바이스의 아이디를 확인되지만 메소드 이름은 확인할 수 없을 때 사용한다.
2) advice사용 순서*
ㄱ) advice를 사용하기전 라이브러리를 가져와야한다.
ㄴ) 트랜잭션 매니저 등록한다.
ㄷ) advice를 aop에 설정하려면 <tx:advice>까지 설정을 해줘야 한다.
ㄹ) advisor로 advice를 지정한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<context:component-scan base-package="com.freeflux.biz"></context:component-scan>
<!-- Transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.freeflux.biz..*Impl.*(..))" id="allPointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allPointcut"/>
</aop:config>
</beans>
5. 포인트컷의 표현식
포인트컷 표현식은 메소드처럼 생긴 execution명시자를 이용하여, execution명시자 안에 포인트컷 표현식을 기술한다.
1. 리턴타입지정 : 리턴타입 지정에서 가장 기본적인 방법은 '*'캐릭터를 이용하는 것이다.
1) * : 모든 리턴타입 허용
2) void : 리턴타입이 void인 메소드 선택
3) !void : 리턴타입이 void가 아닌 메소드 선택
2. 패키지 지정 : 패키지 경로를 지정할 때는 '*', '..' 캐릭터를 이용한다.
1) com.jbr.biz : 정확하게 com.jbr.biz 패키지만선택
2) com.jbr.biz.. : com.jbr.biz 패키지로 시작하는 모든 패키지 선택(하위 패키지까지 선택하려면 이 방법을 사용)
3) com.jbr..impl : com.jbr패키지로 시작하면서 마지막 패키지 이름이 impl로 끝나는 패키지 선택
3. 클래스 지정 : 클래스 이름을 지정할때는 '*', '+' 캐릭터를 이용한다.
1) BoardServiceImpl : 정확하게 BoardServiceImpl 클래스만 선택
2) *Impl : 클래스 이름이 Impl로 끝나는 클래스만 선택
3) BoardService+ : 클래스 이름뒤에 '+'가 붙으면 해당 클래스로부터 파생된 모든 자식 클래스 선택,
인터페이스 뒤에 '+'가 붙으면 해당 인터페이스를 구현한 모든 클래스 선택
4. 메소드지정 : 메소드를 지정할 때는 주로 '*' 캐릭터를 사용하고 매개변수를 지정할 때는 '..'를 사용한다.
1) *(..) : 가장 기본 설정으로 모든 메소드 선택
2) get*(..) : 메소드 이름이 get으로 시작하는 모든 메소드 선택
5. 매개변수 지정 : 매개변수를 지정할 때는 '*', '..' 캐릭터를 사용하거나 정확한 타입을 지정한다.
1) (..) : 가장 기본 설정으로 '..'은 매개변수의 개수와 타입에 제약이 없음을 의미
2) (*) : 반드시 1개의 매개변수를 가지는 메소드만 선택
3) (com.jbr.user.UserVO) : 매개변수로 UserVO를 가지는 메소드만 선택, 이때 클래스의 패키지 경로가 반드시
포함되어야 한다.
4) (!com.jbr.user.UserVO) : 매개변수로 UserVO를 가지지 않는 메소드만 선택
5) (Integer, ..) : 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택
6) (Integer, *) : 반드시 두 개의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택
'Framework > Spring' 카테고리의 다른 글
Spring-JDBC(Oracle) (0) | 2021.06.22 |
---|---|
Spring-AOP(어노테이션 기반) (0) | 2021.06.22 |
Spring-AOP(advice) (0) | 2021.06.21 |
Spring-AOP(간략한 흐름) (0) | 2021.06.21 |
Spring-DI/AOP정리! (0) | 2021.06.18 |