'AspectJ'에 해당되는 글 2건

  1. 2009.03.26 프로스프링6장 aspectJ 코드 실행하기.
  2. 2009.03.16 @Aspect는 누구의 것?
봄싹2009.03.26 00:20
프로스프링 6장은 @AspectJ에 대해서 다룬다..
뒷부분에는 aop의 표준이라고 말 할수 있는 aspectJ에 대해서 잠시 언급이 되는데..
프로스프링 소스를 받아서 실행해보려면..
책에 있는 내용있는 내용에 더불어 몇가지 해주어야 할 것들이 있다.

우선 책에서 나오는 예제들은 IntelJ IDE 기반으로 만들어진.. 소스들이고..관련 lib들이 없다..
그래서 막상 돌려 보려면 관련 lib들을 구하고... 이것저것 해주어야 한다..
번역서가 나오면 지금 계획하고 있는 형태로 새로운 소스가 배포가 될 수도 있으니..
큰 무리는 따르지 않을 것 같다..

물론 능숙한 개발자들은 알아서 손쉽게 돌려 볼 수도 있겠지만...
초보자들에겐 힘든 일이 될 수도 있다..

잠시 다른길로 새어버렸는데;; 다시 본론으로 가자면.. 우선..
com.apress.prospring2.ch06.aspectj.AspectJDemo1.java 파일이 있다..
코드를 보면 asepect 파일인 .aj 파일들이 있고.. AOP는 이놈들이 담당한다..

이클립스에 AspectJ플러그인을 설치 하던가 STS 를 사용하던가.. IDE에서 수행하려면 해당 플러그인의 도움으로 ajc를 할 수가 있는데.. 그렇게 변경하고도 돌려보면
Exception in thread "main" java.lang.VerifyError: (class: com/apress/prospring2/ch06/practical/PerformanceAndHealthCollectingAspect, method: ajc$inlineAccessMethod$com_apress_prospring2_ch06_practical_PerformanceAndHealthCollectingAspect$com_apress_prospring2_ch06_practical_PerformanceLogExtractor$extract signature: (Lcom/apress/prospring2/ch06/practical/PerformanceLogExtractor;Lorg/aspectj/lang/JoinPoint;Ljava/lang/Object;)Lcom/apress/prospring2/ch06/practical/PerformanceLog;) Illegal use of nonvirtual function call
    at com.apress.prospring2.ch06.services.DefaultUserService.login(DefaultUserService.java:13)
    at com.apress.prospring2.ch06.aspectj.AspectJDemo1.main(AspectJDemo1.java:17)

이러한 에러를 만날 수 있을 것이다..
왜 나는 건지 알아보지는 안았지만.. aop가 적용된 객체가 6장 예제 전반에 걸쳐서 사용되어 져서.. 그런지.. 실제로 돌려서 나온 결과들을 비교해보면 의도 하지 않은 AOP들이 적용되다가 예외가 나는듯하다..

그래서 보면 build.xml이 제공되어 진다..
책에선 aspectjtools.jar를 ${ANT_HOME}/lib 에다가 넣고 돌리라고 하는데;;
IDE에서 돌리려면;;
해당 그림처럼 ant 실행도구에 classpath를 잡아줘야 한다.
물론 ${ANT_HOME}/lib 홈에 카피를 했다면;;

해당 프로젝트 root에 가서;;
ant를 쳐주어도 되고..

해당 ant를 실행전에.. aspectj를 설치하라고 나오는데.. 일단 aspectjtools.jar 파일만 구해서 해당 경로에 넣어준다면..
설치하지 않고서도 돌아갈 수 있다..

우분투 유저라면
sudo apt-get install aspectj
라는 명령어로 쉽게 설치가 가능하며..
~/.ant/lib 안에 해당 jar 파일을 카피 해넣어도 물론 빌드를 할 수 있다.

aspectjtools.jar 파일을 구할 때는 잘 구해야 한다.. 사용하는 메이븐 저장소에 해당 jar 파일이 없어서 구글링을 통해서
구한 jar 파일로 예제를 돌렸다가.. 삽질을 하게 되었고.. 나중에는 다른 메이븐 저장소에서 해당 lib를 구해서 결과를 얻게 되었지만.. 말이다..

막상 적고 나니.. 책에 있는 내용을 풀어 놓것 밖에 되지 않는듯 하다.ㅋ
아.. 마지막으로 해당 build.xml 파일을 보면;
<property name="dir.lib" value="../../lib"/>
이부분이 있는데.. 이 경로는 해당 lib 위치로 수정을 하던가 프로젝트 두단계상위에다가 해당 lib 폴더를 만들어서..
해당 jar들을 넣어주어야 한다..
나같은 경우는 그냥..

<!--
    <property name="dir.lib" value="../../lib"/>
      -->
    <property name="dir.lib" value="/home/helols/.m2/repository/"/>
이렇게 바꾸고 해버렷다..!!

이제! 6장 소스 코드 검증도 ~ 끝나는구나!!
Posted by is윤군
봄싹2009.03.16 13:33
@Aspect 어노테이션은... 어디것인가 ?
우선 스프링 @AOP를 사용하기 위해선.. Aspect class 에서 해당 어노테이션을 붙여줘야 한다. .
그럼 @Aspect는 어디에서 만든 어노테이션인가 ?

보면. .
import org.aspectj.lang.annotation.Aspect;
aspectj lib 안에 들어있다.. ;;

음.. 현재 배타리딩 진행중인 pro spring2.5 책 6장에 보면..

@AspectJ has nothing to do with AspectJ; it is a set of Java 5 annotations that Spring uses to parse the pointcuts and advice. This also means that @AspectJ aspects have no dependency on AspectJ; they use pure Spring AOP


이런 문구가 나온다..

@Aspectj 는 AspectJ와 아무런 상관이 없다. 이것은 스프링에서 포인트컷과 어드바이스를 파싱하는데 사용하는 JAVA5 어노테이션 집합이다. 이것은 또한 @AspecJ 애스팩트는 AspectJ와 의존관계를 가지고 있지 않다. 그것들은 순수한 Spring AOP를 사용한다.

머 대충 번역하자면 이런 뜻인데;; 어떤 의미에서 필자가 적었는지 의문스럽다..
분명.. @Aspect , @Pointcut, @Before, @AfterReturning, @AfterThrowing, @Around, @After ... 이모든 어노테이션은 AspectJ의 Annotation 이고... 스프링 @AOP(책에서 이야기하는 @AspectJ ) 또한 이 Annotation 을 사용하는데..
음... 분명 햇갈리는 문장이다..

이것이 뜻하는건... 스프링 @AOP 로 만들어진 Aspect는 아무런 수정없이 AspectJ(1.5 이상..)와 호환이 가능하다..
다만 AspectJ의 pointcut 이 더 섬세하고 많이 지원하기 때문에 스프링 AOP에서 적용 되지 않은 JoinPoint들고 적용 될 수 있으니.. 잘 확인해봐야 한다..

결론은.. @Aspect는 AspectJ의 것이고.. 스프링 @AOP는 AspectJ에서 제공한 Annotation으로 돌아간다는것! ;;


Posted by is윤군