블로그 이미지
Max.

calendar

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Notice

2009.05.22 21:12 개발관련
spring-roo-annotations 프로젝트

이 프로젝트는 말 그대로 ROO 어노테이션만 정의해 놓은 프로젝트로 좀 특이합니다. ROO 안의 어떤 프로젝트와도 의존성이 없습니다. 그리고 요 어노테이션은 도메인 클래스에서 많이 보던 것들이 나옵니다. 특이하게 패키지 안에 readme.txt 파일을 두고, 주의점을 알려주고 있습니다. 한마디로 손대지 마랍니다. 아무튼, 현재 등록된 인터페이스는 아래와 같습니다.

public @interface RooBeanInfo
public @interface RooConfigurable
public @interface RooDataOnDemand
public @interface RooEntity
public @interface RooJavaBean
public @interface RooPlural
public @interface RooEditor
public @interface RooIntegrationTest
public @interface RooToString
public @interface RooWebScaffold


spring-roo-classpath 와 spring-roo-classpath-javaparser  프로젝트

이 프로젝트는 파서를 이용하여, 파일을 자동생성하는 주요 프로젝트 입니다. 메다데이타를 이용하여 생성된 파일을 파싱하여 수정하거나, 생성될 파일의 path를 지정하거나, 메타이이타관련 shell 명령을 실행하는 부분이 담겨 있습니다.
classpath 프로젝트에서는 파싱관련 인터페이스만 구현된 상태이고, 구현체인 classpath-javaparser 프로젝트는 http://code.google.com/p/javaparser/ 에서 가져와서 java,aj파일 파싱하는데 쓰고 있습니다.

shell 관련 명령어로는 ClasspathCommands에 "generate class file", "new java file", "new test file", "new persistent class jpa"가 있고, FieldCommands에는 "insert field", "add field number", "add field string", "add field date jdk", "add field boolean"가 있으며, MetadataCommands에는 "metadata trace","metadata summary",  "metadata for id", "metadata for type"이 있습니다. classpath-javaparser의 details 패키지에는 4개의 javaperser가 metadata를 파싱하는게 있는데 그종류는 다음과 같습니다.

JavaParserAnnotationMetadata.java
JavaParserConstructorMetadata.java
JavaParserFieldMetadata.java
JavaParserMethodMetadata.java

제너레이터의 핵심인 만큼, spring-roo-classpath는 꽤 많은 패키지와 파일들이 존재해서 자세히 보려면, 꽤 시간이 걸릴듯 합니다. 일단 여기서는 클래스패스를 지정해주고, 메파테이타를 기반으로 파싱하고, 파일(java,aspect)을 생성하고, 수정하는 패키지 정도로만 이해하고 넘어 가겠습니다.


spring-roo-file-monitor 와 spring-roo-file-monitor-polling 프로젝트

모니터링은 전에 예제에서 봤던것 처럼, ROO shell을 켜논 상태에서 파일의 변화를 자동으로 감지하여 ,변화된 내용을 자동으로 반영하는 무시무시한 기능 입니다. 예를 들어 도메인 클래스에 필드를 shell이 아닌, 파일에서 추가하게 되면, shell에서 모니터링하고 있다가 변화된것을 감지하고, 관련된 aspect 파일을 수정시켜 줍니다.

monitor-polling 프로젝트는 monitor 프로젝트의 NotifiableFileMonitorService 구현체 달랑 하나 들어있습니다. MonitorService구현체이기 때문에 실제 서비스 제공자인 셈입니다. 모니터링 하는 기능이니, EventListener와 관련 있습니다. 어떠한 shell 명령클래스도 존재하지 않습니다.


spring-roo-file-undo 프로젝트

전에 예제 테스트할때, 어떤 조건하에서 명령을 잘 수행하다가 마지막에 명령의 논리적인 오류(대부분사용자에 의해서 의도적으로 오류를 발생했을때를 포함한)가 발생하게 되면, 다리 롤백하게 됩니다. 이때, 새로 생성된 파일이 있기도 하고, 기존의 파일을 수정하기도 합니다. 따라서 롤백될때 즉, Undo 될때, 관련된 클래스들이 여기에 존재 합니다. internal패키지에 Create,Delete,Update관련 클래스들이 보입니다. 역시 shell 명령어 관련 클래스는 존재하지 않습니다.


spring-roo-metadata 프로젝트

메타데이터 관련된 가장 상위 클래스 들이 존재 합니다. Cache, Item, DependencyRegistry, MetadataService 같은 기본적인 구현체를 제공하고 있지만, 가장 중요한 MetadataProvider 인터페이스와 MetadataNotificationListener 인터페이스는 classpath 프로젝트에서 추상 클래스를 제공하고, 이를 각각의 addon 프로젝트에서 구현체를 만들어 등록하거나 사용하고 있습니다. AbstractMetadataItem 역시 본 프로젝트에서 추상 클래스로 제공하고 있으나 각각의 addon 프로젝트에서 구현해야만 합니다. 그럼 나중에 살펴볼 각각의 addon 프로젝트들은 위 3개의 구현체 클래스가 필히 존재하게 되겠네요.


spring-roo-model 프로젝트

ROO 모델 즉, 도메인 클래스에 대한 규약을 정의해 놓은 클래스들로 구성되어 있습니다. spring util에서 제공하는 Assert를 이렇게 유용하게 쓰는군요. 프로젝트는 5개의 자바파일로 구성된 비교적 간단한 프로젝트(프로젝트 실은 모듈이라고 봐야 하는데, 이클립스에서 하다 보니....) 입니다.


spring-roo-process-manager 프로젝트

ROO의 머리에 해당하는 핵심 프로세스 프로젝트 입니다. monitoringRequest, initialMonitoringRequest 요청을 받아 metadataService, undoManager, fileMonitorService, notifiableFileMonitorService 처리를 이곳에서 처리 합니다. 패키지는 manager에 인터페이스가 존재하고, manager.event에 Listener,Status,Provider가 있습니다. manager.internal에 인터페이스 구현체들이 있습니다. ProcessManager의 유일한 구현체인 DefaultProcessManager가 internal에 있습니다. (보통 구현체를 impl라고 패키지명을 주었는데, 여기서는 internal이라고 하는군요. internal이 더 합당해 보이네요.) Scope는 @ScopeDevelopment 를 사용하고 있습니다. 커스터마이징 대상 프로젝트는 역시 아닌것 같습니다.


spring-roo-project 프로젝트

ROO로 생성할 프로젝트 관련 내용을 관리하는 프로젝트입니다. 최초 프로젝트 생성시 create project -topLevelPackage 명령을 통해서 얻는 프로젝트 관련 정보를 갖습니다. 프로젝트명, topLevelPackage, 의존성들, pathResolver,Path 정보를 가지고 있습니다. 이 프로젝트 역시 별로 열어볼 일이 없을것 같은 프로젝트입니다.


spring-roo-support 프로젝트

일부 유틸기능의 파일들은 Spring프로젝트에서 그대로 복사해 왔다고 legal문서에 밝히고 있습니다. 자체 패키지는 lifecycle하고, logging 두개의 패키지 입니다.  lifecycle 패키지는 어노테이션 인터페이스로 두가지 형태가 있습니다. @ScopeDevelopmentShell는 ROO shell에서 개발할때, 사용되는 어노테이션으로 위에서 봤던 각종 CommandMarker 구현체들이 이에 속합니다.(예 - BootstrapCommands.java)  @ScopeDevelopment는  shell이 아닌, 개발시점으로 위에서 모니터링에 의해서 어떤 명령들이 실행되는것이 좋은 예입니다.(예 - PollingFileMonitorService.java) logging  패키지에는 핸들러가 있는데, 그외에 특별한게 없습니다.

이렇게 해서 대충 대충 훑어 봤습니다. 사실 처음 시작할때는 최대한 자세히 봐야지 했는데, 갈수록 대충대충 봐집니다. 아마도 너무 많은 프로젝트이고, 소스코드 이해도가 떨어져서 대략 이런 역할을 하는구나 하는정도만 보고 말았던것 같습니다. 차후에 addon 프로젝트를 보면서, 필요하다면, 각각의 프로젝트를 좀더 자세히 보는 시간을 가져야 겠습니다. 지금은 addon 프로젝트에 마음이 포커싱되어 있어서 여기는 별로 신경쓰이질 않는군요.

그래도 대략 소감을 적어보면, 모듈프로젝트 분리를 참 잘해놨다는 생각이고, 자세한 분석에는 시간이 다소 걸리겠지만, 작은 단위로 분리가 도움이 될꺼라는 생각입니다. 그러나 역시 전체적인 그림을 그리기 위해서는 레퍼런스 문서가 절대적으로 필요함을 느끼게 했습니다. 그리고 일부 파일은 공개가 아직 안된것 같은데, M1이나, 그이상의 버젼을 기대해 봐야 겠습니다.

이제 21개나 되는 add-on 모듈 프로젝트를 볼 차례 입니다. 뜨아~
신고
posted by Max.
prev 1 next