최범균님의 책.. 스프링2.5를 보고 공부하고있다.
서평이나 사람들 말을 들어보면 완벽한 책이라고... 베스트셀러에다..
인정한다. 헌데 나랑 좀 맞지 않는 듯... 아..그것보다 내 실력이 쓰레기이기 때문이겠지...ㅋㅋ
구성은 좋은데 너무 딱딱하여 이해가 잘 가지 않는다. 논문보는듯..;;

아무튼 AOP.. 부분.. 다 훑어봤지만 20%정도 이해한듯 하다. 헐..어려워..

AOP
어플리케이션 전반에 걸쳐 필요한 기능. 핵심 비즈니스 기능과 구분하기 위해 공통기능을 공통관심사항(cross-cutting concern)
핵심 로직을 핵심관심사항(core concern)이라고 한다.

AOP용어
Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의하고 있다. 예를 들어, 메소드를 호출하기 전에 트랜잭션을 시작한다(공통기능) 기능을 적용한다는 것을 정의하고 있다.
Joinpoint :  Advice를 적용 가능한 지점을 의미한다. 메소드호출, 필드값 변경 등이 해당된다.
Pointcut : Joinpoint의 부분 집합으로써 실제로 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있다.
Weaving : Advice를 핵심 로직 코드에 적용하는 것을 위빙이라 한다. 공통코드를 핵심 로직 코드에 삽입하는 것이 위빙이다.!
Aspect : 여러 객체에 공통으로 적용되는 공통 관심 사항을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다.

스프링 API를 이용한 AOP
(1)MethodBeforeAdvice
대상 객체의 메소드를 실행하기 전에 공통 기능을 적용하고 싶을때에 사용되는 Advice인터페이스.

void before(Method method, Object[] args, Object target) throws Throwable;

Method method : 대상 객체에서 실제로 호출될 메소드를 나타내는 Method객체
Object[] args : 메소드 호출시 전달된 인자 목록
Object target : 실제 대상 객체

이외에..
(2)AfterReturningAdvice : 대상객체의 메소드를 실행한 후 공통기능 적용.
(3)ThrowsAdvice : 예외가 발생했을때 공통기능을 적용하고 싶을 때 사용.
(4)MethodInterceptor : 앞의 어드바이스를 모두 합쳐 놓은 인터페이스


Pointcut 및 Advisor 설정
Advice를 작성했다면,, Advice를 어떤 Joinpoint에 적용할지를 지정할 차례이다. 즉, Pointcut을 설정할 차례.

org.springframework.aop.support.JdkRegexMethodPointcut : 정규표현식을 이용하여 포인트컷 정의.
org.springframework.aop.aspectj.AspectJExpressionPointcut : aspectj의 표현식을 이용하여 포인트컷 정의

<bean id = "beforeLogAdvice" class = "kame.......MethodBeforeLogAdvice" />
<bean id = "writePointcut" class = "org.springframework.aop.support.JdkRegexpMethodPointcut">
     <property name = "pattern" value = ".*write.*" />
</bean>

<bean id = "writeAdvisor" class = "org.....DefaultPointcutAdvisor">
    <property name = "advice" ref = "beforeLogAdvice" />
    <property name = "pointcut" ref = "writePointcut" />
</bean>

위 설정은 writeAdvisor는 beforeLogAdvice 어드바이스가 writePointcut 포인트컷에 적용된다는 것을 정의하고 있다. 즉, 메소드 이름에 write를 포함하고 있는 메소드를 호출할때 beforeLogAdvice를 적용하라고 설정하였다.
위 작업은 꾀 성가신 작업인데 RegexMethodPointcutAdvisor를 이용해 작업을 줄일수 있다.

<bean id = "beforeLogAdvice" class = "kame.......MethodBeforeLogAdvice" />

<bean id = "writeAdvisor" class = "org.....RegexMethodPointcutAdvisor">
    <property name = "advice" ref = "beforeLogAdvice" />
    <property name = "pattern" ref = ".*write.*" />
</bean>


AspectJExpressionPointcut

expression프로퍼티를 이용하여 Pointcut을 정의하는 표현식을 설정한다.
<bean id = "getPoint" class = "org......AspectJExpressionPointcut">
      <property name = "expression" value = "execution(public !void get*(..))" />
</bean>

<bean id = "getAdvisor" class = "org.....DefaultPointcutAdvisor" >
       <property name = "advice" ref ="cacheadvice" />
       <property name = "pointcut" ref = "getPoint" />
</bean>
expression프로퍼티는 포인트컷을 표현하는 표현식을 값으로 갖는다. 위 코드에서 excution 명시자는 메소드의 실행을 명시하며, 접근제어가 public 이고 리턴타입이 void가 아니며 메소드의 이름은 get으로 시작하고 0개 이상의 파라미터를 갖는 메소드의 실행 시점을 Pointcut으로 설정함을 의미한다.



이외에도 AOP에 대한 설명이 주옥같다.. 그리고 어렵다;; 나머지는 책을 참조하자!! (포스팅 넘 힘들어..;;)
AND