블로그 이미지
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. 9. 2. 14:40 개발관련

한동안 Roo 개발이 뜸 했었습니다. 9/1일자로 다시 시작되고 있는데, 최근에 개발되고 있는 addon 모듈이 바로 web-mvc 입니다. 과거 제가 Roo UI는 구리다 라고 했는데, addon-web-mvc에서는 layout을 tiles로 바꾸고, css와 Dojo-dijit 테마, i18n message 그리고 spring:theme 까지 추가해서 개발되고 있는걸 보니, 또다른 UI를 선 보일듯 합니다.

새로운 UI에 대한 addon 개발은 다소 의도적인듯 합니다. Roo가 활성화 되려면, 여러가지 UI addon 모듈이 개발되길 원하는 전략적인 것인지도 모르겠습니다. 아무튼 좋은소식입니다. 하루빨리 나오길 기대해 봅니다.

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

Roo를 바라보는 시선  (0) 2009.09.05
몇 안남은 옛날 개발자  (4) 2009.09.04
Roo addon-web-mvc-jsp  (0) 2009.09.02
쉬운것 과 어려운것  (5) 2009.08.27
Spring Roo ITDs의 가독성  (0) 2009.08.22
김대중 전 대통령의 서거를 기록한다  (4) 2009.08.20
posted by Max.
TAG addon, ROO, Spring

댓글을 달아 주세요

2009. 8. 22. 14:48 개발관련

Spring Roo는 도메인 객체를 여러 ITDs로 분리함으로 도메인 객체의 복잡성을 체계화여 직관성을 높여줌으로써 개발의 효율성을 주고자 했던것이 ITDs를 이용하게된 Roo의 전략이라 할수 있습니다.

문제는 이런 복잡성은 사라지지 않고, 잘 조직되어 있다는게 문제입니다. ITDs로 조직됨으로써 필연적으로 Aspectj를 이용한 *.aj파일들이 생성되는데, 그 언어적 특성상 해당 소스코드는 일반 자바코드 보다 복잡하게 보입니다. 물론 자바를 알고 있으면 해독하는데 큰문제는 아니지만, 가독성에 직관화를 해치는건 어쩔수 없이 느껴지게 됩니다. 예를 들어 아래 코드는 일반자바 코드와 비교해도 사용되는 텍스트수가 좀 지나치다 싶은 생각을 지울수 없습니다.

Article_Roo_Entity.aj :

privileged aspect Article_Roo_Entity {
    @javax.persistence.PersistenceContext   
    transient javax.persistence.EntityManager Article.entityManager;    
    @javax.persistence.Id   
    @javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)   
    @javax.persistence.Column(name = "id")   
    private java.lang.Long Article.id;    

    ...(생략)....

    public static javax.persistence.EntityManager Article.entityManager() {   
        javax.persistence.EntityManager em = new Article().entityManager;       
        if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");       
        return em;       
    }   
   
    public static long Article.countArticles() {   
        return (Long) entityManager().createQuery("select count(o) from Article o").getSingleResult();       
    }   
   
    public static java.util.List<net.max.article.domain.Article> Article.findAllArticles() {   
        return entityManager().createQuery("select o from Article o").getResultList();       
    }   
   
    public static net.max.article.domain.Article Article.findArticle(java.lang.Long id) {   
        if (id == null) throw new IllegalArgumentException("An identifier is required to retrieve an instance of Article");       
        return entityManager().find(Article.class, id);       
    }   
   
    public static java.util.List<net.max.article.domain.Article> Article.findArticleEntries(int firstResult, int maxResults) {   
        return entityManager().createQuery("select o from Article o").setFirstResult(firstResult).setMaxResults(maxResults).getResultList();       
    }     
}

*.aj파일은 자동으로 생성되고, 관리되어 지기 때문에 직접 수정하는 일은 추천되지 않습니다. 그러나, 해당 소스를 들여다 볼일이 생기는건 어쩔수 없고, 그렇다면, 해당 코드를 좀더 직관적으로 이해할수 있게 하려는 노력이 필요할듯 합니다. (Roo로 몇가지 예제를 만들어 보면, aj파일을 안 볼수 없게 만듭니다.) 

다행히도 이러한 점에 대해 Tomas Salfischberger가 약간의 재미있는 아이디어를 냈습니다. 코드블럭({code})으로 감싸서 마치 자바코드 처럼 보이게 한다는 것 같은데요. 아직 10여일이 지나도록 멘트가 없는걸 보니 살짝 불안한데, 받아들여질지 지켜봐야 겠습니다. 그가 말한 코드는 아래처럼 한다는 것입니다.

Pizza_Roo_Entity.aj:

{code}
    private java.lang.Integer Pizza.version;

    public Integer Pizza.getVersion() {
        return this.version;
    }
    
    public void Pizza.setVersion(Integer version) {
        this.version = version;
    }
{code}

이정도면 가독성에 크게 문제가 없을듯 하니다.

그리고, 영어가 짧으면, 인내는 길어지는 법인가 봅니다.예전부터 Roo에 대한 버그를 많이 접했는데, 이를 알려줄 방법(?)이 없어서, 누군가 그 버그를 찾아내거나, 지적해 줄때까지 참고, 인내하는 것이 생활이 되는것을 느끼고 있습니다. 학원이라도 다녀야 할듯 합니다.

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

Roo addon-web-mvc-jsp  (0) 2009.09.02
쉬운것 과 어려운것  (5) 2009.08.27
Spring Roo ITDs의 가독성  (0) 2009.08.22
김대중 전 대통령의 서거를 기록한다  (4) 2009.08.20
휴가  (2) 2009.08.07
Spring Roo 잡소식  (8) 2009.07.30
posted by Max.
TAG äj, ITDs, ROO, Spring

댓글을 달아 주세요

2009. 7. 30. 09:45 개발관련

3rd party addon 개발은 언제쯤...

현재는 Roo 관련된 어떤 정식 문서(Reference)도 없는 상태에서 addon개발은 약간 시기상조인 것일까? 지금도 addon은 개발하는데 큰 문제는 없지만, Roo개발자는 addon관련된 모듈을 정리(refactoring)할때까지 기다려주길 원하고 있다. (일관성 있게 addon을 개발할수 있게 지원할 모양이다.) 향후 올해 SpringOne USA에서 addon 개발과 관련된 발표에서 관련정보를 오픈할 생각이라고 한다. 그때가 아마 가을.. 이지??? 기다림의 미덕을 보일때다..



Roo가 웹프로젝트 전용은 아니다.

Roo 프로젝트를 생성했다고, 해당 프로젝트(maven프로젝트)가 웹프로젝트로 생성되는건 아니다. new controller라는 명령을 최초로 실행했을때, 비로서 WEB-INF니, web.xml이 생성된다. 나는 모듈프로젝트(웹프로젝트가 아닌)를 생성할때 create project, configure logging 이 두개의 명령으로 생성하여 기본 골격만 생성하는데 Roo를 사용할 때도 있다.



Static Finder를 위한 Mock 테스트는 어떻게...

Roo M2 버전때 새로 추가된 명령 중에 new mock test 가 추가 되었다. 로드존슨이 만들었고, EasyMock 형식으로 사용한다. 이걸로 Mock은 끝나는줄 알았는데, Phil이란 사람이 태클을 걸고 나섰다. 아무 이유 없이(사실 이유를 설명할 문서도 없다) 이런식으로 강제하면 곤란(lock in)하지 않느냐 난 Mockito가 좋은데 말이지?.. 이렇게 강력하게 의견을 표현하니, Roo 개발자은 언제나 그렇듯 좋은의견이라며, 정리되는대로(?) Mockito addon을 추가할 모양이다. 여기에 우리의 스타 Toby님이 한줄 댓글로 PowerMock을 지그시 알려주신다. (그래도 Mockito addon은 나올것 같다.)



xxx.roo 파일을 만들어주는 기능이 필요하다.

프로젝트 만들때마다 여러명령을 조합하는데, 그것을 기록할 방법이 없다고 투덜 댈수밖에 없다. 그래서 반드시, 확실히,기필코,꼭 그 기능을 추가할 예정이라고 Roo개발자는 말한다. 하지만, 지금 당장은 아니라며 스미일표시를 보낸다. :)



Roo UI는 구리다.(구리city 하고는 관계없음... 안 웃기네-.,-)

controller 명령으로 각종 crud 및 환경에 관련된 jsp들이 생성된다. UI는 Spring-JS를 사용하니, 현재 지원되는건 Dojo뿐이다. 이조차도 오류가 내눈에도 보일정도면 많은 모양이다. 하지만, Roo개발자가 Spring-JS 프로젝트를 어찌할수는 없을테다. 기능은 둘째치고라도 모양새도 별로 이쁘지 않다. Dojo도 각종 extention(Dijit,dojox)을 이용하면 볼만하련만, Roo UI 디자인은 영~ 꽝이다.(어설프게 이미지도 들어있다.) UI 디자인이 ext-Js처럼 예쁘면, 관리자용으로 활용해 보련만...
그런데 Spring-JS에서 jQuery는 언제 지원하려는걸까? jQueryUI도 볼만하던데...



Rul Rewrite Filter 처음 써본다면...

오래전 아파치 프로젝트에서 이 프로젝트가 존재하고, 무엇에 쓰는 물건인지도 이해하고 있었지만, 직접사용해본적이 없었다. Roo에 이게 포함되어 있는데, 알아둘것이 있다. 여기서 정의되지 않은 경로는 웹에서 접근할수 없다는 것이다. js,css 등도 마찮가지다. Rulrewrite 설정파일에 추가해줘야 한다. 안하고, 왜 페이지나 js파일이 없다고 나올까? 라고 삽질하는 수가 있다. :)

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

김대중 전 대통령의 서거를 기록한다  (4) 2009.08.20
휴가  (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
posted by Max.
TAG ROO, Spring

댓글을 달아 주세요

  1. 물개 2009.07.30 11:15  Addr Edit/Del Reply

    구리city 하고는 관계없음... 웃긴데요? -.,-

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2009.07.30 18:54  Addr Edit/Del

      이런 것 좋아하면, 몇개 더 올려야 겠어요.ㅎㅎ;
      내일이면, 금요일이네요.
      즐거운 한주되세요 :)

  2. Favicon of http://kangjin.tistory.com BlogIcon kj 2009.07.30 17:50  Addr Edit/Del Reply

    3th -> 3rd 가 맞지 않을까요? 좀.. 쓸데 없죠.. ^^;;

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2009.07.30 18:58  Addr Edit/Del

      고마워요. 고쳤습니다.
      제가 오타가 좀 많습니다.^^;
      그리고, 반가워요~ :)

  3. Roo 공부 하시느라 정신 없겠어요 ㅎㅎㅎ
    대박인데요 ㅋ

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2009.08.01 08:20  Addr Edit/Del

      ㅎㅎ 대박이요?
      Roo가 대박이 될지 쪽박이 될지는 좀더 지켜봐야 겠어요 ^^*

2009. 7. 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. 7. 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. 7. 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

댓글을 달아 주세요

  1. 알 수 없는 사용자 2009.07.22 15:12  Addr Edit/Del Reply

    Real world non-trivial business application에서는 하나의 데이타 타입의(예를 들면 Invoice) 검색에 필드10~20중에 임의의 갯수의 검색필드를 이용하는걸 지원하는 경우가 비일비재한데 이런식으로 finder method를 일일히 만들면 method name, method갯수등이 아주 난잡해질 것 같군요.

    findInvoiceByAmountGreaterThanAndCustomerEqualsAndReceivedBetweenAndAssignedToEqualsAndApprovalStatusEquals

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2009.07.23 19:27  Addr Edit/Del

      finder 명령은 다른 명령에 비해 자주 업데이트 되고 있는 것 같습니다. RC1에서는 다이나믹 finder도 새로 추가되었다고 하고, 위처럼 검색 필드가 여러개 일때, 전용 VO를 사용하는 방법도 고려되어야 할듯 합니다. 아직은 여러가지로 지켜봐야 할 것들이 좀 있습니다. GA 버전이 나올때까지 좀더 기다려 봐야 겠습니다...

2009. 7. 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. 7. 9. 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. 6. 1. 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

댓글을 달아 주세요

  1. 앞으로 이 부분에 대한 보완이 있을 것 같네요.
    예를 들어 비활성을 표시할 수 잇는 annotation이나 annotation parameter을 추가하거나 해서 말입니다.
    경험을 나눠주셔서 감사합니다.

    • Favicon of http://yunsunghan.tistory.com BlogIcon Max 2009.06.17 20:15  Addr Edit/Del

      관련되어서 보완한다는 언급이 있었나요? 요즘 통 바빠서 모니터링을 못해서 어떻게 돌아가는지 최신소식을 모르고 있어요.

      말씀하신 aj에 그런 기능을 넣어버리면 여러가지 꼬일수도 있다는 생각이 들어서(비활성시 속성을 추가하면, 반영안되버리는 경우처럼), aj는 직접 핸들링하지 말고 그저 알아서 생성되게 두고, 최소한 수정해도 반영은 되게 유지하는 지금수준의 정도가 좋지않을까 하는 생각을 해봤어요. 완전히 hard하게 강제하진 않고 있으니까요.

      아무튼 지켜 봐야 겠네요. 읽어주셔 감사하지요 ^^*

2009. 6. 1. 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

댓글을 달아 주세요

prev 1 2 3 4 5 6 7 next