http://dev.anyframejava.org/anyframe/doc/core/3.2.0/corefw/guide/aop-components.html



Weaving 또는 CrossCutting

AOP가 Core Concerns 모듈의 코드를 직접 건드리지 않고 필요한 기능이 작동하도록 하는 데는 Weaving 또는 CrossCutting이라고 불리는 특수한 작업이 필요하다. Core Concerns 모듈이 자신이 필요한 Crosscutting Concerns 모듈을 찾아 사용하는 대신에 AOP에서는 Weaving 작업을 통해 Core Concerns 모듈의 사이 사이에 필요한 Crosscutting Concerns 코드가 동작하도록 엮어지게 만든다. 이를 통해 AOP는 기존의 OOP로 작성된 코드들을 수정하지 않고도 필요한 Crosscutting Concerns 기능을 효과적으로 적용해 낼 수 있다.

Weaving은 기존의 자바 언어와 컴파일러에서는 쉽게 구현할 수 있는 방법이 아니었으며 본격적인 AOP 기술이 등장한 것은 1990년대 후반 제록스 PARC 연구소에서 그레거 킥제일(Gregor Kiczales)에 의해 AspectJ가 개발되면서라고 볼 수 있다. 
Weaving을 처리하는 방법은 다음과 같이 3가지가 존재한다.
Weaving 방식
설명
Compiletime Weaving별도 컴파일러를 통해 Core Concerns 모듈의 사이 사이에 Aspect 형태로 만들어진 Crosscutting Concerns 코드들이 삽입되어 Aspect가 적용된 최종 바이너리가 만들어지는 방식이다. (ex. AspectJ, ...)
Loadingtime Weaving별도의 Agent를 이용하여 JVM이 클래스를 로딩할 때 해당 클래스의 바이너리 정보를 변경한다. 즉, Agent가 Crosscutting Concerns 코드가 삽입된 바이너리 코드를 제공함으로써 AOP를 지원하게 된다. (ex. AspectWerkz, ...)
Runtime Weaving소스 코드나 바이너리 파일의 변경없이 Proxy를 이용하여 AOP를 지원하는 방식이다. Proxy를 통해 Core Concerns를 구현한 객체에 접근하게 되는데, Proxy는 Core Concerns 실행 전후에 Cross Concerns를 실행한다. 따라서 Proxy 기반의 Runtime Weaving의 경우 메소드 호출시에만 AOP를 적용할 수 있다는 제한점이 있다. (ex. Spring AOP, ...)


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

Spring 3.0 MVC 정리  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06

Before Advice
After Returning Advice
After Throwing Advice
After Advice
Around Advice 

이런것들이 Advice 인것이다. 

이런 advice들이  pointcut-ref 를 이용해서 pointcut을 설정하는것이고....  

그러면 pointcut으로 정해진 메소드들이 실행되려는 순간 적절한 Advice 들이 실행된다. 

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

Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
@Aspect 어노테이션을 이용한 AOP 설정


우선 xml 정의에서 <aop:aspectj-autoproxy /> 를 선언해야 @Aspect 어노테이션이 적용된 빈객체를 Aspect 로 사용하게 된다.





@Aspect
@Order(3)
public class ProfilingAspect {

// 포인트 컷을 정의하고 그 포인트컷에서 호출할 
@Pointcut("execution(public * madvirus.spring.chap05.board..*(..))")
// 아래의 method 는 Pointcut 대상메소드가 호출될때 실행될 공통기능으로 정의된 빈클래스의 어떤 메소드가 호출될지를 정의함  
private void profileTarget() {}

 
// Around Advice를 구현... 
// @Around 어노테이션 값으로 @Pointcut 어노테이션을 적용한(할) 메소드의 이름을 지정함
@Around("profileTarget()")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String signatureString = joinPoint.getSignature().toShortString();
System.out.println(signatureString + " 시작");
long start = System.currentTimeMillis();
try {
Object result = joinPoint.proceed();
return result;
} finally {
long finish = System.currentTimeMillis();
System.out.println(signatureString + " 종료");
System.out.println(signatureString + " 실행 시간 : " + (finish - start)
+ "ms");
}
}
}


위처럼 포인트컷과 어드바이스를 분리하지 않고 
       @Before("execution(public * madvirus.spring.chap05..*(..))")

또는...

@Before("PublicPointcut.publicMethod()")
public void before() {
System.out.println("[LA] 메서드 실행 전 전처리 수행");

@Before 어노테이션 값으로 포인트컷 표현식이나 포인트컷 어노테이션이 적용된 메소드 이름이 올 수 있다. 


 

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

JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28


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