Whiteship's Note

AspectJ의 @DeclareError를 사용해서 컴파일 시점에 아키텍처 에러 검증하자.

AOP : 2008.10.21 11:26


참조: http://www.parleys.com/display/PARLEYS/Home#slide=1;title=Spring%20Architectures;talk=20676612

위 발표자료 내용 주에 아주 잼나는 코드를 건졌습니다. 지난 번 KSUG에서 발표한 내용과 겹치는데 아래 코드는 그때 제가 보여드린 코드보다 좀 더 좋은 것 같아서 가져왔습니다.

@Aspect
public class SystemArchitecture {
  @Pointcut("execution(* configurator.*.*(..))")
  public void configuratorLogic () {}
  @Pointcut("execution(* dao.*.*(..))")
  public void dao() {}
  @Pointcut("within(*.dao.*)")
  public void inDaoLayer() {}
  @Pointcut("call(* *.service.*.*(..))")
  public void callServiceLayer() {}
}


@Aspect
public class Layering {
  @DeclareError("SystemArchitecture.inDaoLayer() && "+
   "SystemArchitektur.callServiceLayer() ")
  public static final String DAOsNotFromServices =
   "DAO must not call Service!";
 @DeclareError(" (call(* java.sql.*.*(..)) && " +
  "!within(*.dao.*) ) ")
  public static final String JdbcOnlyInDAOs =
   "JDBC only in DAOs!";
}

좋은 건 이Aspectj를 사용하면 @DecalreError를 사용해서, 컴파일 시점에 아키텍처 에러를 검증할 수 있다는 것입니다. 제가 준비했던 코드는 cflow를 사용해서 런타임에 검증하는 방법이었습니다. 따라서 테스트 하지 않고 그냥 커밋하면 뭐 어떻게 찾아낼 방법이 없었습니다. 그런데 이 방법을 쓰면 코딩할 때 문제되는 코드를 발견할 수 있으니 훨씬 좋은 것 같습니다. 캬.. 귿..


top

  1. 둥이아빠 2010.06.01 11:57 PERM. MOD/DEL REPLY

    이곳에서 매번 좋은 자료 얻어갑니다^^
    Pro Spring도 잘 보고 있구요..

    하나 질문을 드리려고 하는데요...

    AspectJ의 DeclareError를 이용해서 여러가지 개발 정책들을 정의했는데요.
    현재 Framework 개발 중이다 보니..
    해당 Aspect 클래스를 컴파일해서 Jar로 같이 배포하려고 하고 있습니다.

    Aspect 클래스가 컴파일 되는 시점에서는 DeclareError가 잘 발생이 되고 Cross References View에도 관련된 클래스들이 보여지는데요

    Aspect 클래스 소스를 Framework 소스들과 같이 컴파일해서 특정 이클립스 프로젝트에 Jar로 배포하면 DeclareError가 발생 되고 있지 않습니다.

    배포시에 특별하게 신경써야 하는 부분이 있는지도 궁금합니다^^

    Favicon of http://whiteship.me BlogIcon 기선 2010.06.01 12:49 PERM MOD/DEL

    흠.. 글쎄요.
    패키징 하면서 아마 포인트컷이 제대로 안먹힌것이 아닐까 싶은데요. 포인트컷 테스트를 해서 원하는 지점에 포인트컷이 걸리는지 확인해봐야겠습니다.

    http://whiteship.me/2378

    제목은 엉뚱하지만 저 안에 보시면 포인트컷 테스트 하는 방법이 들어있습니다.

    Favicon of http://lckymn.com BlogIcon Kevin 2010.06.01 18:45 PERM MOD/DEL

    Aspects를 묶어서 jar로 일종의 모듈을 만드셨고,
    그 모듈을 사용하는 프로젝트에도 위빙이 되어야 할경우,
    프로젝트상에서 aspect 적용되게 컴파일 해주셔야 하구요.
    ajc 컴파일 하실때 -aspectpath 옵션을 사용해서
    그 모듈 파일(들)을 설정해 줘야합니다.

    maven과 aspectj-maven-plugin를 쓰시면,
    aspectLibraries 파라미터를 사용하시면 되구요.

    그런데, 여기 언급한 문제가
    http://whiteship.me/2641#comment6903603
    발생할 수도 있습니다.

    Favicon of http://whiteship.me BlogIcon 기선 2010.06.01 21:31 PERM MOD/DEL

    흠. 그건 AspectJ로 @Aspect를 사용할 때 이야기 같군요.

    @Aspect를 스프링 AOP에서 사용한다면 그런 옵션을 줄필요가 없을 것 같아요. 스프링에서 제공하는 @Transaction이나 @Configurable 처리용 Aspect들이 아무런 별도 옵션 없이도 잘 도는거 보면.. 그렇게 생각이 되네요.

    @Aspect를 패킹해서 써본적이 없어서 원; ㅋ

  2. 둥이아빠 2010.06.01 15:43 PERM. MOD/DEL REPLY

    답변 감사드립니다^^

    Favicon of http://whiteship.me BlogIcon 기선 2010.06.01 21:31 PERM MOD/DEL

    잘 해결되시길!

Write a comment.




: 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : ··· : 40 :