블로그 이미지
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  

Notice

'spirng-roo-bootstrap'에 해당되는 글 1

  1. 2009.05.22 spring-roo-bootstrap 프로젝트 보기
2009.05.22 21:10 개발관련

spring-roo-bootstrap 프로젝트

ROO 셀을 실행할때 명령을 보면, 다음과 같습니다.

java -Djava.ext.dirs=%ROO_HOME%/lib;%ROO_HOME%/dist org.springframework.roo.bootstrap.Bootstrap "classpath:/roo-bootstrap.xml"

Bootstrap.java를 실행시킨다는 말인데요. 해당 루 서브 프로젝트를 보면, spirng-roo-bootstrap이 그에 해당 합니다. 따라서 루가 어떻게 실행되고 있는지 알려면 먼저 이것을 살펴볼 필요가 있습니다. 루에 관한 레퍼런스 문서가 나오기 전까지는 이런식으로 밖에 알아보는 방법이 저에겐 없는것 같습니다. 그럼 어떻게 동작하는지 알아 보겠습니다.

Bootstrap.java - 주요 code

 public Bootstrap(String applicationContextLocation) {
  Assert.hasText(applicationContextLocation, "Application context location required");
  setupLogging();
        ctx = new ClassPathXmlApplicationContext(applicationContextLocation);
        Map<String,Shell> shells = ctx.getBeansOfType(Shell.class);
        Assert.isTrue(shells.size() == 1, "Exactly one Shell was required, but " + shells.size() + " found");
        shell = shells.values().iterator().next();
        Map<String,CommandMarker> commands = ctx.getBeansOfType(CommandMarker.class);
        for (CommandMarker bean : commands.values()) {
         shell.getParser().addTarget(bean);
        }
        Map<String,Converter> converters = ctx.getBeansOfType(Converter.class);
        for (Converter bean : converters.values()) {
         shell.getParser().addConverter(bean);
        }
 }

해석해보겠습니다. 먼저 ClassPathXmlApplicationContext로 roo-bootstrap.xml에 설정된 스프링 빈들을 가져 옵니다. getBeansOfType으로 shell들을 가져오는데 하나 이상 가져오면 안됩니다. 현재 프로젝트엔 Jline이라는 셀 밖에 없습니다. roo.shell 프로젝트의 Shell 인터페이스를 구현한 rooo.shell.jline프로젝트에서 JLineShell을 가져오게 됩니다.

그다음 CommandMarker 구현체들을 가져옵니다. 이것의 구현체들은 roo.addon.*프로젝트로 된 모든 프로젝트에 존재하는것 입니다. 현제 약 15개의 구현체가 있습니다. 이 구현체Map을 shell 파서에 target으로 추가 합니다. 이부분을 좀더 자세히 보면, SimpleParser의 addTarget()에서 CliAvailabilityIndicator 어노테이션을 가져와서 추가 시킵니다. CliAvailabilityIndicator는 @CliAvailabilityIndicator형태로 각각의 CommandMarker 구현체에 메서드 역할에 따라 붙여논것들입니다. 이것들은 그 명령이 사용가능한 명령인지 아닌지 나타내는 것들입니다. 전에 예제를 돌려볼때, hint나 Tab키로 어떤 명령들이 실행 가능한지를 보여주는 것을 볼수 있었는데, 이것이 아마도 그런 역할을 하는것 같습니다. 옵져버패턴을 썼다고 하는군요.  @CliAvailabilityIndicator(명령 보이기,안보이기), @CliCommand(명령), @CliOption(명령에서의 옵션)에 대해서는 addon 프로젝트에서 자세히 살펴봐야 겠습니다.


그다음에 CommandMarker과 똑같은 절차로 Converter를 shell 파서에 Converter로 추가 합니다. Converter는 Member예제에서 도메인 필드 추가시 string,number,date 등의 자바 형변환 관련된 명령인것 같습니다.

이후, run 메서드에서 실행시키는고 있습니다. 실행부는 이렇게 비교적 간단하게 끝납니다. 정리하면, Bootstrap에서는 스프링 IoC 컨테이너를 로드하고, 로드된 빈객체중 커멘드와 컨버터러를 셀에 추가하여 실행시키고 있습니다. 여기서 커멘드(명령)는 실행가능한것인지 아닌지 판단되어지고, 컨버터러는 모두 등록되어집니다. 여기서 알수 있는건, 셀 명령에서 부분적으로 명령이 보였다 안보였다하는것을 이해할수 있으며, 컨버터러는 미리 로드됨을 알수 있습니다.

BootstrapCommands.java -  주요 code

 @CliCommand(value="development mode", help="Switches the system into development mode (greater diagnostic information)")
 public String developmentMode(
   @CliOption(key="enabled", mandatory=false, specifiedDefaultValue="true", unspecifiedDefaultValue="false") boolean enabled) {
  processManager.setDevelopmentMode(enabled);
  return "Development mode set to " + enabled;
 }

앞서 간단히 살펴봤던, CommandMarker의 구현체 입니다. 아주 간단한 형태로 명령하나에 옵션하나가 있습니다. development mode 설정하는것인데, shell에서 development mode -enabled 하면 개발모드로 바뀝니다. 그런데, 바뀐다고, 로그가 자세히 나오거나, 뭐가 특별히 변경되는걸 찾지 못했습니다. 아무튼 개발모드로 바뀌는 명령입니다. 자세한 내용을 어디서도 찾을수 없어서 나중에 레퍼런스가 나오면 알아봐야 겠습니다.

이제 해당 프로젝트엔 2개의 자바 파일이 더 남아 있습니다. 그것은 ProcessManagerHostedExecutionStrategy 와 ProcessManagerPostConstructBeanPostProcessor 입니다. 둘다 어렵습니다. ProcessManager라는 ROO 심장으로 가는길인데, 역시 한계가 느껴집니다. 이 두개는 소스코드만으로는 알아보기 힘들고, 전체적인 그림을 먼저 떠올릴수 있어야 할듯 합니다. 마무래도 레퍼런스에 의지해야 할것 같습니다.

신고
posted by Max.
prev 1 next

티스토리 툴바