능글맞은 구렁이

Spring-AOP(XML 기반) 본문

Framework/Spring

Spring-AOP(XML 기반)

보라색츄르 2021. 6. 22. 09:33

※주의※

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
Comments