블로그 이미지
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.07.23 11:59 개발관련

어제부로 RC1이 릴리즈 되었습니다. 몇가지 버그와 기능향상 그리고 추가된 기능까지 있습니다. 이번엔 로드존슨까지 몇몇 작업을 거든 사람들이 있군요. 다음 릴리즈는 드디어 GA 버젼입니다.

Bug

  • [ROO-96] - Two textareas which are decorated with dijit.form.SimpleTextarea in the same page will sumit as a single parameter for POST submits
  • [ROO-105] - NullPointerException in SecureRandom when using IBM JDK 6.0.4.0 due to missing lib/ext dir
  • [ROO-106] - Unable to create project from petclinic sample script due to XPath exception
  • [ROO-113] - Cannot create project with top level package like ab.cd (STS)
  • [ROO-114] - Roo does not roll back file system commits when an exception occurs
  • [ROO-116] - Cannot install finder for entity with similarly named fields
  • [ROO-118] - @RooEntity(version=false) doesn't work
  • [ROO-121] - Web content generation does not appear to work on mac os x.
  • [ROO-122] - @RooConfigurable produces errornous ITD for parameterized types
  • [ROO-123] - Generated controller finder method loses case on length() check for mixed case string fields
  • [ROO-124] - Roo does not clean up finder methods from UI navigation menu when removed from @RooEntity
  • [ROO-126] - Converting an entity to have a compound id still retains the 'show as a long' method in the controller
  • [ROO-134] - MS SQL driver class definition incorrect
  • [ROO-136] - WebFlow defined with -flowName when installing webflow - camel-cased name gets lowercased in navigation UI
  • [ROO-140] - Roo's configure email template does not set up dependencies
  • [ROO-141] - create project foo, followed by "mvn package" causes a build failure because there is no web.xml file
  • [ROO-142] - Problem with new controller automatic when you use the same Class Name
  • [ROO-143] - Two MultiSelect boxes which are decorated with dijit.form.MultiSelect in the same page will sumit as a single parameter for POST submits
  • [ROO-145] - Not all current types in java.lang correctly recognized by JavaParserUtils
  • [ROO-150] - Ubuntu 8.10 user: Cannot start Spring Roo
  • [ROO-153] - Delete object using openJPA
  • [ROO-154] - Modiying menu.jsp can cause roo controller creation/management to fail
  • [ROO-156] - Roo generated web app does not work correctly in tomcat and dm Server
  • [ROO-161] - Complex metadata dependency relationships behaving inconsistently between identical execution runs

Improvement

  • [ROO-5] - Selenium Add-on: remove plugin repository for Codehaus snapshot repo required for maven-selenium-plugin
  • [ROO-107] - Switch from DriverManagerDataSource to DBCP BasicDataSource
  • [ROO-109] - Add static protected entityManager() method to all entities with introduced EntityManager field
  • [ROO-110] - Stop beep noise on Windows machines via Roo shell
  • [ROO-111] - It is better to avoid using @import to include css in JSP files generated by ROO
  • [ROO-112] - Test compatibilty of Roo applications in different application servers
  • [ROO-115] - 'install web flow' command requires prior generated Spring MVC artifacts
  • [ROO-117] - Add Windows batch file equivalent to roo-mvn for *nix platforms to allow easier development of Roo on Windows
  • [ROO-125] - Roo should ignore .svn/CVS folders for autocomplete
  • [ROO-127] - Default Error handlers
  • [ROO-128] - Use JSR-303 annotations to feed schema settings to JPA/Hibernate (for table creation)
  • [ROO-129] - JPA's @ManyToOne mapping fails when using Hibernate in conjunction with MySQL
  • [ROO-135] - Update UI when create, update or delete method is disabled via @RooWebScaffold
  • [ROO-137] - Built in support for JNDI data sources.
  • [ROO-144] - Development mode startup script enhancements
  • [ROO-148] - NotifiableFileMonitorService should allow notification of create, delete and rename operations
  • [ROO-149] - Finders for @ManyToOne
  • [ROO-151] - Enhance SQL in dynamic finders for LIKE statements
  • [ROO-155] - 'new persistent class jpa' command should be hidden if no persistence is installed yet
  • [ROO-160] - Provide additional thread information when shell is in development mode

New Feature

  • [ROO-11] - Configure DocBook and basic Maven site plugin in build
  • [ROO-138] - Integration of Roo with bundlor (install bundlor and associated commands)

Task

  • [ROO-165] - Complete 1.0.0.RC1 release

Dojo 관련된 한글 깨지는 현상과 거기에서 비롯되는 날짜입력 오류에 대한 건 누가 언급을 안하나 봅니다. 버그픽스의 상당 부분이 포럼의 질문에서 이슈트랙커로 이어지는데, 아직 location관련된 질문은 본적이 없습니다. 아직은 사소한 거니까 GA나올때까지 기다려 봅시다.

신고

'개발관련' 카테고리의 다른 글

휴가  (2) 2009.08.07
Spring Roo 잡소식  (8) 2009.07.30
Spring Roo 1.0.0.RC1 Released  (0) 2009.07.23
Spring Roo 스크립트 활용하기  (0) 2009.07.17
살아남는법 vs 살아가는법  (2) 2009.07.17
오늘은 故 노무현 전 대통령 49재 입니다.  (2) 2009.07.10
posted by Max.
TAG RC1, ROO, Spring
2009.07.17 18:00 개발관련
Roo는 shell 방식의 명령 조합으로 도메인 객체를 생성한다. 도메인 객체의 기본적인 골격을 shell에서 만든다는 것이다. 이런 shell 명령들을 한꺼번에 실행할수도 있는데 그것이 스크립트 방식이다. 예를 들어 petclinc.roo 또는 vote.roo 가 그런 shell 명령을 한꺼번에 실행할수 있도록 scripts명령을 제공하고 있다.

Roo에서는 모듈화(집단화)할수 있는 방법을 두가지 정도로 생각해 볼수 있는데 그중 하나가 shell을 이용한 모듈화이고, 다른 하나는 add-on을 이용한 모듈화 방법이다. 여기서는 shell을 이용한 모듈화 방법에 대해서 생각해 보고자 한다.

방법은 간단하다. 위에서 말한 것처럼 여러가지 스크립트를 만들어 순서적으로 조합하면, 쉽게 기본틀을 생성할수 있다. 예를 들어보면 아래와 같은 도메인간의 관계를 도식으로 나타낼수 있다.
이 모듈들의 도메인과 관계를 분리하고, 스크립트 관점으로 전환해서 생각해 보자.
모듈과 관계를 분리하였다. 스크립트는 재사용성이 첫번째 목표이기에 관계가 모듈 스크립트에 포함되어서는 안된다. 이유는 관계는 도메인 마다 다르게 형성될수 있다. 일종의 도메인 특약에 걸린다..(도메인은 스냅샷이라는 말이 있지 않는가)  따라서 모듈 스크립트엔 관계가 포함되어서는 안된다.(속성도 적절하게 일반회 되어야 한다) 예를 들어 어떤 도메인에서는 회원이 한번에 하나의 상품만 주문해야 하는 경우가 있는가 하면, 한번에 여러개의 상품을 주문할수 있는 경우도 있다. 그것은 도메인 문제 영역 안의 문제이지 틀을 잡아주는 스크립트 문제로 풀어서는 안된다. 따라서 모듈 스크립트에서는 관계를 따로 정의할수 있도록 관계 스크립트를 분리하는게 좋다. 다시 위의 도식을 스크립트로 구분하면 아래처럼 표현할수 있다.
- 회원관리.roo
- 상품관리.roo
- 주문관리.roo
- 커뮤니티.roo
- 도메인관계.roo
각각의 스크립트는 해당 도메인에 관련된 스크립트가 포함되어 있다. 물론 여기서는 범용적인 정의(선언)만 되어 있고 특정 도메인에 특화된 기능은 포함해서는 안된다. 그것은 프로젝트에서 개발자가 손수 작성해야할 도메인 영역이니까 당연한 소리이다.

여기서 또하나 스크립트를 생각해 볼수가 있다. 그것은 개발환경에 관한 스크립트다.
- 개발환경.roo
이것은 말그대로 Roo 스크립트에서 제일 먼저하거나, 프로젝트 개발환경 관련 명령을 한꺼번에 실행할수 있도록 하는것이 목적이다. 이렇게 스크립트를 분리하고, 여러개의 특화된 모듈 스크립트를 다수 만들어 놀수 있다면, 모듈 스크립트의 조합으로 많은 명령을 쉽게 조합하여 원하는 프로젝트 틀을 만들어 낼수 있다. 물론 재사용가능하다.

앞으로 Roo는 shell 명령을 로그형태로 저장할수 있도록 지원한다고 한다.(현재는 명령을 저장할수 있는 방법이 없다.) 그러면, 더욱 편리하게 스크립트를 재사용할수 있게 된다. 또한 하나의 스크립트가 다른 스크립트를 불려서 실행할수 있는 방법도 지원되리라 생각한다. 그렇게 되면, 더욱 스크립트 모듈화가 이루어 질것 같다.

다음에는 add-on을 이용한 모듈화에 대해서 생각해 보자.
신고

'개발관련' 카테고리의 다른 글

Spring Roo 잡소식  (8) 2009.07.30
Spring Roo 1.0.0.RC1 Released  (0) 2009.07.23
Spring Roo 스크립트 활용하기  (0) 2009.07.17
살아남는법 vs 살아가는법  (2) 2009.07.17
오늘은 故 노무현 전 대통령 49재 입니다.  (2) 2009.07.10
Roo - Finder.aj 생성하기  (2) 2009.07.10
posted by Max.
2009.07.10 08:57 개발관련

도메인 객체를 만들었다고 Finder.aj가 자동으로 생성되진 않습니다. Finder는 경우의 수가 너무 많아서 다 만들수도 없고, 필요충분조건이 안되어서 사용자가 직접생성할수 있도록 해주고 있습니다. 물론 기본적인 Finder는 Entity.aj에 포함되어 있습니다.

Finder를 만드는 방법은 먼저 어떤 Finder명에 조건검색이 되는 필드명을 붙여가는 식으로 이름명을 짓고 그 이름명의 후보를 검색하여 해당 도메인 aj로 추가하는 방법을 채택하고 있습니다. 간단한 예를 들어 보겠습니다.

다음과 같은 도메인 객체을 생성했다고 가정합니다.
...
new persistent class jpa -name ~.domain.Article
add field string -class ~.domain.Article -fieldName title -notNull -sizeMin 2
add field string -class ~.domain.Article -fieldName userName  -sizeMin 4 -sizeMax 20 -notNull
add field date jpa -type java.util.Date -class ~.domain.Article -fieldName writeDate  -notNull
add field number -type java.lang.Long -fieldName hit -class ~.domain.Article -notNull 0
add field string -class ~.domain.Article -fieldName content -notNull -sizeMin 2 -sizeMax 200

이때, userName이라는 속성으로 검색하는 Finder를 만들어야 한다는 요구사항이 생기면, 먼저 다음과 같은 명령으로 해당 Finder명령이 있는지 검색합니다.

roo> list finders for -class ~.domain.Article
findArticlesByContent(String content)
findArticlesByContentEquals(String content)
findArticlesByContentIsNotNull()
findArticlesByContentIsNull()
findArticlesByContentLike(String content)
findArticlesByContentNotEquals(String content)
findArticlesByHit(Long hit)
findArticlesByHitBetween(Long minHit, Long maxHit)
findArticlesByHitEquals(Long hit)
findArticlesByHitGreaterThan(Long hit)
findArticlesByHitGreaterThanEquals(Long hit)
findArticlesByHitIsNotNull()
findArticlesByHitIsNull()
findArticlesByHitLessThan(Long hit)
findArticlesByHitLessThanEquals(Long hit)
findArticlesByHitNotEquals(Long hit)
findArticlesByTitle(String title)
findArticlesByTitleEquals(String title)
findArticlesByTitleIsNotNull()
findArticlesByTitleIsNull()
findArticlesByTitleLike(String title)
findArticlesByTitleNotEquals(String title)
findArticlesByUserName(String userName)
findArticlesByUserNameEquals(String userName)
findArticlesByUserNameIsNotNull()
findArticlesByUserNameIsNull()
findArticlesByUserNameLike(String userName)
findArticlesByUserNameNotEquals(String userName)
findArticlesByWriteDate(Date writeDate)
findArticlesByWriteDateBetween(Date minWriteDate, Date maxWriteDate)
findArticlesByWriteDateEquals(Date writeDate)
findArticlesByWriteDateGreaterThan(Date writeDate)
findArticlesByWriteDateGreaterThanEquals(Date writeDate)
findArticlesByWriteDateIsNotNull()
findArticlesByWriteDateIsNull()
findArticlesByWriteDateLessThan(Date writeDate)
findArticlesByWriteDateLessThanEquals(Date writeDate)
findArticlesByWriteDateNotEquals(Date writeDate)


대략 지금처럼 아주 다양한 조합의 Finder 후보를 찾을수 있습니다. 그중 마음에 드는것을 골라 놓습니다. 그리고 Finder를 추가하는 명령을 입력 합니다.

roo> install finder -finderName findArticlesByUserName
Managed SRC_MAIN_JAVA\net\max\board\domain\Article.java
Created SRC_MAIN_JAVA\net\max\board\domain\Article_Roo_Finder.aj
Managed SRC_MAIN_JAVA\net\max\board\web\ArticleController_Roo_Controller.aj
Created SRC_MAIN_WEBAPP\WEB-INF\jsp\article\findArticlesByUserName.jsp
Managed SRC_MAIN_WEBAPP\WEB-INF\jsp\menu.jsp

이제 웹사이트서 확인할수 있습니다.


소스가 생성된 뒤에는 소스에서 직접 Finder를 추가 할수도 있습니다.

@RooEntity(finders = { "findArticlesByUserName", "findArticlesByTitleEquals" })
public class Article {
...

Spirng Roo M2 버전에서는 Finder 추가시 Controller.aj 에서 약간의 버그가 있습니다. 버그는 속성명을 제대로 표현하지 못하는 버그입니다.
ex) userName이 username으로 파싱되어 지는데, 이는 해당 Add-on의 사소한 실수인듯 합니다.

[실제 자동으로 생성된 코드]   

@org.springframework.web.bind.annotation.RequestMapping(value = "find/ByUserName", method = org.springframework.web.bind.annotation.RequestMethod.GET)   
    public java.lang.String ArticleController.findArticlesByUserName(@org.springframework.web.bind.annotation.RequestParam("username") java.lang.String userName, org.springframework.ui.ModelMap modelMap) {   
        if(userName == null || username.length() == 0) throw new IllegalArgumentException("A userName is required.");       
        modelMap.addAttribute("articles", net.max.board.domain.Article.findArticlesByUserName(userName).getResultList());       
        return "article/list";       
    } 


신고

'개발관련' 카테고리의 다른 글

살아남는법 vs 살아가는법  (2) 2009.07.17
오늘은 故 노무현 전 대통령 49재 입니다.  (2) 2009.07.10
Roo - Finder.aj 생성하기  (2) 2009.07.10
Roo - @RooWebScaffoldMetadata  (0) 2009.07.10
Roo - Demo 영상  (0) 2009.07.09
공허함  (7) 2009.07.06
posted by Max.
TAG Finder, ROO, Spring
2009.07.10 08:57 개발관련
@RooWebScaffoldMetadata의 속성을 잘 이용하면 view(JSP)에서 편리하게 적용할수 있습니다. 해당 속성들의 역할이 무엇인지 살펴보면 아래와 같습니다.

- automaticallyMaintainView
jsp 페이지를 도메인 필드 등을 변경시 자동으로 view(JSP)에 반영할것 인지는 결정한다.

- formBackingObject
view와 controller 사이에 사용할 객체로 어떤것을 사용할지 결정한다.(현재 Roo는 도메인 객체를 사용하고 있다) 

- exposeFinders
기본으로 생성되는 finder 메서드 이외에 추가적으로 생상된 finder를 view에 보일것인지 결정한다.

- create
- delete
- list
- show
- update
이것들의 기본값은 true인데, 해당 기능을 모두 view에서 사용할수 있게 하는데, 특정 기능을 제한하고 싶다면, false로 바꾸면 사용할수 없다. 권한 관리시 편리하다.


신고

'개발관련' 카테고리의 다른 글

오늘은 故 노무현 전 대통령 49재 입니다.  (2) 2009.07.10
Roo - Finder.aj 생성하기  (2) 2009.07.10
Roo - @RooWebScaffoldMetadata  (0) 2009.07.10
Roo - Demo 영상  (0) 2009.07.09
공허함  (7) 2009.07.06
Zeitgeist (시대정신)  (4) 2009.06.22
posted by Max.
2009.07.09 15:33 개발관련
Roo에 대한 간단한 사용예 정도의 Demo인데, Roo가 무엇인지 궁금한 사람들에게 보여주면 쉽게 설명이 될것같군요.


신고

'개발관련' 카테고리의 다른 글

Roo - Finder.aj 생성하기  (2) 2009.07.10
Roo - @RooWebScaffoldMetadata  (0) 2009.07.10
Roo - Demo 영상  (0) 2009.07.09
공허함  (7) 2009.07.06
Zeitgeist (시대정신)  (4) 2009.06.22
지긋지긋한 완곡어법  (2) 2009.06.19
posted by Max.
TAG ROO, Spring
2009.06.01 09:10 개발관련

예전에 이명령에 대해서 대충 살펴 보았는데, 좀더 자세히 살펴 보려고 합니다. 실세 이것을 사용하려면, 여러가지 사건들을 테스트해봐야 하기 때문에, 일반적으로 실무에서 사용할때의 주의점을 살펴보는건 어쩌면 당연한 일일테니까요.

자동으로 생성된 aj 파일을 사용에 맞게 수정할수 있으나, 믿어서는 안된다.

말그대로 자동생성되는 aspect 파일들을 언제든지 입맛에 맞게 수정할수 있습니다. 그러나, 믿어서는 안됩니다. 믿지 못한다는 말은, 이 파일들은 shell에 의해서 언제든지 재생성될수 있습니다. 재생성된다는 말은 기존에 수정된 내용이 모두 사라진다는 말입니다. 따라서 해당 로직에 무엇을 수정한다면, 자바파일(.java)에 위치시켜야 하고, aj에 수정은 권고될수 없습니다. 언제 사라질지 모르기 때문이죠. 사라진다는 말은 예를 들어 도메인 클래스에 @RooToString 어노테이션을 제거하게 되면, 도메인_Roo_ToString.aj 파일을 shell의 모니터링 기능에 의해서 자동으로 감지되고, 해당 파일을 지워버워버립니다. 만약 Roo shell을 켜지 안았다고 안심했더라도, Roo shell를 켜는 순간 삭제가 자동으로 되어버립니다. 그러니 aj 파일에 로직을 입력하고 안심하지 마세요. 언제 지워질지 모릅니다. shell에 의해 Managed 될때도, 기존에 작성한것은 모두 지우고 다시 생성하므로 기존에 변경한 내용은 없어져 버립니다. 한마디로 *.aj에서 수정된건 보존되지 않습니다.

신고
posted by Max.
TAG ROO, Spring
2009.06.01 09:07 개발관련


 M1은 약간 실망입니다. A2에서는 모델간의 의존관계가 비교적 잘 되었습니다. 그런데 M1은 본 예제조차도 잘되지 않습니다. 심지여 petclinic.roo도 생성되지 않습니다. 모델(도메인)간의 의존관계에서 문제가 발생하는듯 합니다. 나중에 관련 소스를 찾아봐야 겠습니다. (Ben의 결혼 때문인지, 관련 세미나 때문인지... A1 처럼 부랴부랴 내논 느낌이네요. 그래도 조만간 버그픽스는 이루어 질듯 합니다. 지금처럼 빠르게 진행된다면요....)

아래는 테스트한 예제 입니다. A2에서는 잘 되고, M1에서는 잘 안됩니다. 아래 주석중 '관계' 부분만 주석처리하고 돌려보면, M1에서도 잘 생성됩니다. (ROO가 생성에 집중한 느낌이 자꾸 생기는데, 사실은 객체지향과 도메인지향에 포커싱하는걸 잊지 말아야 합니다. -_-;; )

/*
create project & jpa install
================================================================
*/
create project -topLevelPackage net.max.blog
install jpa -provider HIBERNATE -database HYPERSONIC_IN_MEMORY


/*
domain define
================================================================
*/
new persistent class jpa -name ~.domain.Article
new persistent class jpa -name ~.domain.Category
new persistent class jpa -name ~.domain.Comment


/*
add field
================================================================
*/
add field string -class ~.domain.Article -fieldName title -notNull -sizeMin 5 -sizeMax 30
add field date jpa -class ~.domain.Article -fieldName writeDate -type java.util.Date -notNull -past
add field string -class ~.domain.Category -fieldName name -notNull -sizeMin 2 -sizeMax 20
add field string -class ~.domain.Comment -fieldName content -notNull -sizeMin 2
add field date jpa -class ~.domain.Comment -fieldName writeDate -type java.util.Date -notNull -past


/*
add Test
================================================================
 new integration test -entity ~.domain.Article
 new integration test -entity ~.domain.Category
 new integration test -entity ~.domain.Comment
*/


/*
domain & aggregate Relation
   Category -< Article -< Comment
      1:N        1:N
================================================================         
add field set jpa -class ~.domain.Category -fieldName articles -element ~.domain.Article
add field reference jpa -class ~.domain.Article -fieldName category -type ~.domain.Category -notNull false
add field set jpa -class ~.domain.Article -fieldName comments -element ~.domain.Comment 
add field reference jpa -class ~.domain.Comment -fieldName article -type ~.domain.Article -notNull false
*/
// Category
 add field set jpa -class ~.domain.Category -fieldName articles -element ~.domain.Article
// Article
add field reference jpa -class ~.domain.Article -fieldName category -type ~.domain.Category -notNull false
add field set jpa -class ~.domain.Article -fieldName comments -element ~.domain.Comment 
// Comment
add field reference jpa -class ~.domain.Comment -fieldName article -type ~.domain.Article -notNull false


/*
add DTO
================================================================
 new java file -name ~.facade.ArticleDto
 new java file -name ~.facade.CategoryDto
 new java file -name ~.facade.CommentDto
*/


/*
add controller
================================================================
 new controller automatic -name ~.web.ArticleController -formBackingObject ~.facade.ArticleDto
 new controller automatic -name ~.web.CategoryController -formBackingObject ~.facade.CategoryDto
 new controller automatic -name ~.web.CommentController -formBackingObject ~.facade.CommentDto
*/
new controller automatic -name ~.web.ArticleController -formBackingObject ~.domain.Article
new controller automatic -name ~.web.CategoryController -formBackingObject ~.domain.Category
new controller automatic -name ~.web.CommentController -formBackingObject ~.domain.Comment


/*
selenium test
================================================================
 new selenium test -controller ~.web.ArticleController
 new selenium test -controller ~.web.CategoryController
 new selenium test -controller ~.web.CommentController
*/


/*
add logging
================================================================
*/
configure logging -level DEBUG

 

신고
posted by Max.
TAG ROO, Spring
2009.06.01 08:57 개발관련

roo.dat 에서 관련부분 발췌하여 생성해 봤습니다. 이렇게 보니, 이제 정말 ROO 답다는 생각이 듭니다.
신고
posted by Max.
TAG ROO, Spring
2009.06.01 08:57 개발관련

벌써부터 addon 모듈을 공유하고자 하는 사람이 나타났습니다. 충분히 예상했던 부분입니다. 현재 ROO는 jsp Layout부분을 include를 사용해서 처리하고 있습니다. 이게 불만(?)을 품은 marceloverdijk이 sitemesh용 addon을 만들어 공유하고자 하여 Ben이 기쁘게 받아들이고 있습니다. 저도 이앞전 글에서 간단하게 @RooFacade를 만들어본적이 있습니다. ROO의 addon 모듈은 이클립스의 plug-in 모듈보다 쉽게 추가할수 있습니다. 그리고, 추가된 모듈이 간접적인 툴보다, 해당 소스코드에 직접적인 영향을 주니, 이클립스보다 소스코드 생산성에서는 더 큰 영향을 발휘하지 않을까 하는 생각입니다.
'지난 25일 이글을 썼는데 오늘(28일) M1이 정식 오픈되면서,포럼에서 제안한 sitemesh addon 모듈이  Jira에 해당 소스가 올라와 있는것이 보입니다. 정말 발 빠르게 움직이는군요. 제가 생각한 @RooFacade는 ROO 로드맵에 포함된 것이라 앞으로 발전시킬만한 의미는 없어 보입니다.'


또한 기존에 제공되는 addon 모듈이 회사의 개발표준과 맞지 않는다면 얼마든지 수정해서 적용할수있습니다. Stefan의 포럼 답에서는 단순히 생성코드을 수정하여 사용할수 있다고 말하고 있지만 , 소스코드도 수정할수 있습니다. 이것(ROO)은 단순히 제공하고 끝나는 다른 스프링 모듈 프로젝트와 달리, 사용자가 곧 생산자가 되는 역동적인 모듈 프로젝트가 아닌가 합니다. 종전의 오픈소스 프로젝트 처럼 사용자와 제공자의 엄격한 분리 개념 보다는 이들이 혼합되어 시너지를 더 크게 올리는 작용할것 같습니다. 그것은 addon 개발에 대한 부담이 적어서 참여자가 많아지는 것 때문일겁니다.(좀더 깊이 생각하면, 이것에 대한 통제도 있어야 될듯 합니다만...)

이것은 작은 변화라고 볼수 없습니다. 개발자 누구나 addon을 만들수 있는 환경이 된다면, 수식간에 엄청나가 많은 addon이 생겨날수 있으며, 각각의 회사는 이런 addon의 조합으로 자사만의 효과적인 아키텍처를 구축할수도 있습니다.7월말에 GA버젼이 나올 예정이지만, 나왔을때 기대에 부흥할지 아닐지 상당한 이슈거리가 될만한 놈입니다.

신고

'개발관련' 카테고리의 다른 글

blog 예제 테스트  (0) 2009.06.01
Spring Roo 아키텍처 도식  (2) 2009.06.01
Roo의 이클립스 효과  (0) 2009.06.01
사실과 진실의 차이  (2) 2009.05.29
오늘은 책 대신 3편의 동영상을...  (2) 2009.05.27
Spring ROO Module Dependencies과 Cluster 도식  (0) 2009.05.27
posted by Max.
TAG ROO, Spring
2009.05.22 21:55 개발관련


Shell

Roo에서 shell 명령의 컨셉은 크게 두가지 입니다. Domain 클래스처럼, 한번 생성한후 차근차근 필드를 추가하여 관련 aspect를 만드는 방법과 Controller 클래스처럼 한방에 클래와 aspect모두 만드는 방법 입니다. 저는 Domain 클래스 생성 방법을 선택하겠습니다. 이유는 좀더 두 행위를 분리시켜서 생각할수 있고, 향후 DTO Assembler의 확장에도 편리할것 같아서 입니다.

한번의 shell 명령으로 인터페이스와 클래스 파일을 생성해야 합니다. shell 명령은 다음과 같이 두개의 클래스를 구현하면 됩니다. (classpath 에 interface 생성에 관한 부분이 있지만, shell명령으로 인터페이스를 생성하는 방법은 아직 제공하지 않고 있습니다. 이부분을 약간 더 살펴봐야 함.)

FacadeCommand - shell 명령 정의
FacadeOperations - 명령 실행시 생성되는 클래스 스크립트 정의


Annotation
어노테이션은 shell에서 생성된 자바파일에 이미 붙여서 나옵니다. 그러면 shell의 모니터링 기능에 의해서 @RooFacade를 감지하고 aspect 파일을 자동으로 생성하게 됩니다. 생성된 파일의 내용은 모든 Facade에서 기본적으로 제공해야할 메서드를 포함하고 있습니다.(이것이 무엇인지 아직 고민중에 있고, 지금 생각은 Controller에서 제공하는 기본인 list(),delete()등을 참조할 생각입니다.) 이 기능을 담당할 클래스는 3가지 입니다.

RooFacade - 어노테이션 선언
FacadeMetadata - 어노테이션으로 생성하는 스크립트 정의
FacadeMetadataProvider - 리스너에 메타데이터 제공
FacadeAnnotationValues - 어노테이션 정의 부분을 분리(설정이 많을때만, 아니면 FacadeMetadata에 포함해도 됨)


다음은?
위 내용까지는 별 무리없이 구현이 가능합니다만, 다음부터가 문제 입니다. DTO Assembler를 추가해야 하는데, 이것은 기존에 없던 전혀 다른 addon이 되야야 합니다. @RooFacadeDTO 로 자바 클레스를 생성해야하고, Facade의 return 객체를 DTO로 수정(Managed)되어야 합니다. 아마도 각각의 메서드에 @Roo 어노테이션을 붙일수 있게 해야 할듯 합니다. 그러면 좀 복잡해지는데, 나중에 시간을 한번 가져 봐야 겠습니다.

신고
posted by Max.
prev 1 2 3 4 5 6 next

티스토리 툴바