AspectJ의 @DeclareError를 사용해서 컴파일 시점에 아키텍처 에러 검증하자.
참조: 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() {}
}
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!";
}
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를 사용해서 런타임에 검증하는 방법이었습니다. 따라서 테스트 하지 않고 그냥 커밋하면 뭐 어떻게 찾아낼 방법이 없었습니다. 그런데 이 방법을 쓰면 코딩할 때 문제되는 코드를 발견할 수 있으니 훨씬 좋은 것 같습니다. 캬.. 귿..