aop 설정을 자주 잊어버리는데 잊지 않기 위한...


1. 우선 aspect 를 정의 한다. 그리고 정의할때 기능이 담긴 advice를 ref 로 둔다.

<aop:aspect id="traceAspect1" ref="performanceTraceAdvice"> .... </aop:aspect>  .... 부분의 내용을 채우면된다.

2. 두번째로는 pointcut을 정의 한다. express 에는 포인터컷의 대상이될 대상들을 AspectJ의 표현식으로 정의한다.

         <aop:pointcut id="publicMethod" expression="execution(public * madvirus.spring.chap05.board..*(..))"/>

3. 세번째로는 2번에서 선언한 포인트컷을 적용할 차례이다. 이때 적용할 .. 선언되어있는 포인트컷을 pointcut-ref 에 대입한다.
method는 pointcut 대상 메소드가 호출될때 실행될 공통기능으로, 정의된 빈 .. advice 클래스의 어떤 메소드가 호출될지를 정의한다.
즉 performanceTraceAdvice 로 선언된 bean id의 클래스에 trace 라는 메소드가 있어야 한다.

        <aop:around pointcut-ref="publicMethod" method="trace"/>



XML 설정을 통한 AOP 설정

최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

<aop:config>
 // Aspect 설정에서 <aop:aspect> 태그는 한 개의 Aspect를 설정함 , 
// ref 는 적용할 공통기능을 구현한 빈을 설정함 즉, 어드바이스? advice
<aop:aspect id="traceAspect1" ref="performanceTraceAdvice">  (1. 어스팩트 선언)
// Advice를 적용할 pointcut은 <aop:pointcut> 태그를 이용하여 설정한다.id는 식별값, expression 은 포인트컷을 정의하는 AspectJ의 표현식 ( 2. 포인트컷 정의)
<aop:pointcut id="publicMethod"
expression="execution(public * madvirus.spring.chap05.board..*(..))" />
// 아래는 Advice가 적용될 포인트컷의 정의중하나이다.  pointcut or pointcut-ref 속성으로 Advice가 적용될 포인트컷을 지정하는것이다.
//pointcut-ref는 <aop:pointcut> 태그를 이용하여 설정한 Pointcut을 참조할때 사용되고, pointcut 속성은 직접 AspectJ 표현식을 이용하여 
//Pointcut을 지정할때 사용된다.  ( 3. 포인트컷 적용 )

// 즉 aop:around pointcut  또는  aop:around pointcut-ref  둘중하나인데 포인트컷을 선언하고 그걸 쓰는건 아래 
<aop:around pointcut-ref="publicMethod" method="trace" />
</aop:aspect>


/////////////////////////////////////////////////////////////////////////////////////////////////////////////


// 아래는 포인트컷을 안만들고 aop:around pointcut 으로 해서 표현식으로 대상을 정하는 방식
<aop:aspect id="traceAspect2" ref="performanceTraceAdvice">
<aop:around pointcut="execution(public * madvirus.spring.chap05.member..*(..))" 
// method 는 Pointcut 대상메소드가 호출될때 실행될 공통기능으로 정의된 빈클래스의 어떤 메소드가 호출될지를 정의함 
method="trace" />
</aop:aspect>
</aop:config>

위 내용을 간단히 풀어보자면....

난 performanceTraceAdvice 메소드에 대한 aspect를 만들건데, 그 대상은 포인트컷 publicMethod 에 정의했어.
그리고 그 포인트컷을 사용하도록 aop:around 를 선언할거야. 

==========================================

Before Advice 는 대상객체가 실행되기 전에 호출된다.
즉, 만약 Before Advice 에서 에러가 나면 원래 실행되어야 할 객체가 실행되지 않을 수 도 있게 된다.
이를 잘 이용하면, 권한 검사이 접근권한이 없으면 예외를 발생시켜서 호출을 막는 형태의 구현도 가능하다나 뭐라나...

After Advice 는... try catch finally 에서 finally랑 비슷하다. 즉 메서드 실행됐는지, 예외를 발생시켰는지의 여부에 상관없이 메서드 실행이
종료된 이후에 적용된다.


Around Advice 는 다른 모든 어드바이스를 한번에 구현할 수 있는 Advice 라고 보면된다. 
(즉 실행될 객체를 조인트포인트로 가져오므로 원하는 내용을 실행될 객체 앞뒤에 쉽게 배치할 수 있다)

 
혹은
<bean id="logging" class="madvirus.... LoggingAspect"/>

<aop:config>
    <aop:pointcut id="servicePointcut"
        expression="execute(* *..*Service.*(..))" />

    <aop:aspect id="logginAspect" ref="logging">
        <aop:around pointcut-ref="servicePointcut" method="logging"/>
    </aop>
</aop:config>

처럼 포인트컷 만들고 (express 설정) 그 포인트컷을 쓰는 aspect를 만든다고 생각해도 간단하다

Service로 끝나는 인터페이스를 구현한 모든 클래스의 모든 메소드에 LoggingAspect 가 적용된다는의미이다.



'IT > 스프링' 카테고리의 다른 글

Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28
Spring Filter components in auto scanning  (0) 2011.12.28

+ Recent posts