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

'SpringRoo'에 해당되는 글 3

  1. 2011.02.22 Roo에서 list sorting
  2. 2010.10.07 SmartGWT stack_overflow
  3. 2010.08.10 Spring Roo(1.1.0.M1) 에서 addon 맛보기
2011.02.22 10:21 개발관련
Roo Entity의 객체관계에서 sorting은 @OrderBy("title DESC") 형태로 가능하다. 그러나 Entity 자체를 정렬하는 것은 없다. 기본으로 생성되는 _Roo_Entity.aj에서는 기본적인 CRUD만 있고, 정렬관련된 옵션은 없다. 그럼 finder를 생각해 볼수 있는데, finder 역시 현재까지는 특별히 지원하는 정렬기능이 없다. Entity의 속성중 특정 속성을 조건으로 검색하는 것은 되지만, 정렬까지는 지원하지 않는다. 관련해서 이슈로 등록((https://jira.springsource.org/browse/ROO-1592)되었지만, 진행된 내용은 아직 없다. 즉, 현재 Roo 버전으로는 가능한 방법이 없다는 것이다.

자동완성 기능으론 할수 없으니, 손수만들면 된다. 좀 거시기하긴 하지만, 정렬기능이 지원될때까지 어쩔수 없다. 방법은 여러가지가 있겠지만, 가장 적당해 보이는 것이 finder 메서드를 직접 구현하는 것이다. 해당 Entity에 static 으로 구현하면 된다. 이때 HQL를 원하는데로 구현하면 된다. 아마도 자동완성의 한계를 이렇게 구현할수 있을 것이다. 
    public static List<Article> findArticleSortEntries(int firstResult, int maxResults) {
        return entityManager().createQuery("select o from Article o Order By o.id DESC", Article.class).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
    }

또다른 방법으론 Nicholas Albion 이 제안한 필터 방식(https://jira.springsource.org/browse/ROO-241)인데 이는 자동생성을 염두해둔 방법으로 제안한 것이다. 

finder add --finderName findEmployeesByDepartment --orderBy "userName ASC" --filterClass ~.server.domain.EmployeePagingFilter

//(annotation might be formatted something like this)
@RooEntity(finders = { {name="findEmployeesByDepartment",orderBy="userName ASC",filterClass=EmployeePagingFilter} })
public class Employee { ... }

저작자 표시
신고
posted by Max.
TAG SpringRoo
2010.10.07 20:05 개발관련
SmartGWT의 JSOHelper 유틸클래스는 자바객체를 자바스크립트 객체로 전환해주는 편리한 유틸로 개발시 자주 사용된다. 그러나 아직 정착되지 않은 이 오픈소스는 오류가 심심치안게 보인다. 나는 간단한 JS 설정을 하는데 stack_overflow 라는 황단한 일이 생겨서 몇시간을 삽질했다. 그래서 공유 한다.

[stack_overflow가 발생하는 코드]
JavaScriptObject industrialTypeSource 
= (JavaScriptObject) editorForm.getValue("industrialType");
JSOHelper.setAttribute(industrialTypeSource,"id",
editorForm.getField("industrialTypeId").getValue());
JSOHelper.setAttribute(industrialTypeSource,"name",
editorForm.getField("industrialTypeId").getDisplayValue());


[정상적으로 처리되는 코드]
JavaScriptObject industrialTypeSource 
= (JavaScriptObject) editorForm.getValue("industrialType");
JSOHelper.setAttribute(industrialTypeSource,"id",
(Integer) editorForm.getField("industrialTypeId").getValue());
JSOHelper.setAttribute(industrialTypeSource,"name",
(String) editorForm.getField("industrialTypeId").getDisplayValue());


차이는 형변환 캐스팅한것 밖엔 없다. 반~드~시! 명시적으로 형변환을 선언하는 것이 좋겠다. 

처음 적용하는 기술에서는 대부분 적절한 API 사용 미숙 때문에 시간을 소비하는데, 그런 행동이 습관화되어, 기본적인 테스트를 해보지 않은 것이 장시간 삽질하게 된것 같다. 


이 포스트는 이것을 기억하기 이한 기념샷 이다.
저작자 표시
신고
posted by Max.
2010.08.10 10:09 개발관련
현재(2010-08-09) Spring Roo는 1.1.0.M3 [rev edaeb84] 버전이지만, addon Command 부분에 약간의 문제가 있다. 심지여 Window O/S 에서는 빌드도 정상적으로 안된다. 아무튼, 이런 난관에도 불구하고, 구버전(M1)에서 테스트 해보았다. 과거 addon 개발처럼, 무식하게(spring-roo-addon-facade 만들기), 프로젝트 생성해서, 직접 멘땅에 소스코드를 작성하는게 아니라, --template 옵션을 사용한 Roo 프로젝트로 작성할수 있다.( M2에서는 이부분을 분리하여, addon 이라는 Command를 새로 추가 했다, 실은 그것을 테스트 해보려고 했던 것인데...)

순서는 간단하다. 먼서 addon프로젝트를 생성하고 작성한 다음, 빌드하고, 생성된 jar를 사용하는 Roo 셀의 bundle 디렉토리에 넣고(왜 bundel일까? 그것은 roo에서 felix를 쓰고 있는 것과 관련이 있다. 실제 생성된 소스코드는 모두 felix 어노테이션으로 묶여져 있다), Roo 재시작 하면, addon을 사용할수 있다. 여기서 테스트할 예제는 첫번째이니, 1)기본예제 그대로 빌드해서 2)Roo 프로젝트에서 사용할수 있는지만 보자.



1)Spring Roo Addon 기본예제 빌드하기 

Roo 셀을 띄운 다음, 아래와 같이 프로젝트를 생성하고, 바로 빌드 한다. 아무것도 하지 않아도, ROO_ADDON_SIMPLE 예제엔 text 파일 생성 스크립트가 들어 있다.
project --topLevelPackage net.max.hello.roo.addon --projectName net.max.hello.roo.addon --template ROO_ADDON_SIMPLE

(다시한번, M3에서는 'addon create simple --topLevelPackage net.max.hello.roo.addon --description some word' 형식을 취한다)
 
이렇게 해서 생성된 소스코드는 아래와 같다.(기타 설정파일은 제외)
Commands.java - Shell 명령을 받아 처리 하는 부분
Operations.java - Interface
OperationsImpl.java - Commands로 부터 실제 처리할 명령어를 구현해 놓은 부분
ProertyName.java - addon 목적을 구현한 traget 클래스
이것 설명이 좀 어렵겠다 싶어서, 인터넷에 떠도는 자료를 참고 하면 아래 그림처럼 생각하면 되겠다.

Commands.java 소스코드를 보면, @CliAvailabilityIndicator 와 @CliCommand이 나오는데, 해석하는데 어렵지 않다, 각각 사용할수 있는 명령과 사용하는 명령을 나타내는데, 차후 천천히 보면 된다. 여기서는 이런 일련의 작업들이 쉽게 이해하라고, Ben Alex라는 아저씨가 예제를 만들어 줬으니 그냥 구경하고 빌드해 보자.

빌드는 mvn install 하면 된다. 이것 역시 maven 프로젝트는 별다를게 없다. 빌드하면, jar파일이 target 폴더에 생성되는데, 그걸 Roo의 셀에서 인식할수 있도록 bundle 폴더에 복사해서 붙여넣기 하면 이걸로 끝이다. 이제 Roo 셀에서 해당 명령을 볼수 있다. 그럼 이제, 새 Roo 프로젝트로 정말로 되는지 보자.



2) Roo 프로젝트에서 실행하기

일반적인 Roo 프로젝트 처럼 스트립트를 실행하고, 위에서 만든 Command를 실행한다. 위의 명령은 'welcome' 으로 시작되는 명령으로 3가지 옵션이 있다. 각각 실행해 보면, 본 프로젝트에 hello.txt와  hej.txt 파일이 생성된다.(아마도 나중에 쓸모있는 addon이 되려면, 이런 생성파일들이 java,xml,jsp 등의 파일 확장자를 가질 테지...) 내가 테스트한 스크립트는 아래와 같다.

project --topLevelPackage net.max.hello --projectName test-hello 
persistence setup --database HYPERSONIC_IN_MEMORY --provider HIBERNATE 
entity --class ~.doamin.Account 
field string --fieldName name
field string --fieldName email
welcome write hello
welcome property --name HOME_DIRECTORY 
welcome property --name USERNAME 
welcome write hej
controller all --package ~.web

'welcome write' 는 txt파일 생성 예제이고, 'welcome property'는 그냥 System 변수를 출력하는 예제이다. 이렇게 간단히 addon을 만들어 target프로젝트에 적용할수 있다. 

이번 기본 제공 예제에는 Metadata 구현 클래스가 없지만, 그것으로 Roo Entity Metadata인 '@RooJavaBean, @RooToString, @RooEntity' 같은 편리한 어노테이션도 만들수 있다. 다음엔 Metadata를 이용한 예제에 도전해 보자.

추가1) 
STS에 포함된 Spring Roo M2로 빌드도 가능한데, 달라진 부분은 addon명령으로 생성하는것과, 각 Commands, Operations에 도메인 마지막 패키지명이 붙는것(HelloCommands.java 같은) 이외에 OSGi 설정파일이 추가된것 뿐이다.

추가2) 
혹시나 해서, 오늘(2010-08-10) 다시 M3 빌드해 보니 에러없이 빌드만 잘된다(jline문제). 리비전도  1.1.0.M3 [rev 476ec5f] 으로 바뀌었다. 그러나 여전히 addon 명령은 안된다. 적어도 윈도우에선... Cygwin 에서도 안된다. 아마 정식 M3 공개 전까진 계속될듯 하다. 오류메시지는 아래와 같은데, 대략 짐작이 간다. *nix를 좋아하는... 

더보기


저작자 표시
신고
posted by Max.
prev 1 next

티스토리 툴바