2012. 7. 27. 11:29 IT

a mircro Groovy web framework 


https://github.com/bleedingwolf/Ratpack 

License : Apache License, Version 2.0


groovy 하면 RoR에 영감을 얻었다는 grails가 떠오르지만.. 마찬가지로  Sinatra 에 영향을 받은 Ratpack 이라는 경량 web framework이 있습니다. 


물론 아직 beta 수준이라서 어디 써먹기에는 참 애매하지만... 하여튼 잠깐의 틈을 내서  study. 


홈페이지에 간단하게 설치절차가 나와있지만,

eclipse 기반으로 작업할때 어떻게 하면 좋은지에 대한 경험을 기록하고자 합니다. 




- Requirements

jdk 1.5 이상?

groovy 1.7.1+

gradle

eclipse , groovy eclipse plugin (option)


- ratpack build 

1. 다운로드 받은 ratpack project를 새로운 eclipse groovy project로 생성하고나서 복사합니다.

2. gradle buildDistro 를 실행

cf) [gradle] Using Gradle from Ant (via gradlew) 글을 이용하여 ant build 파일을 이용해 돌릴 수 도 있습니다. 

3. build/libs 위치에 library 들이 모두 생성되었는지 확인되면 OK.


- make ratpack project 

1. eclipse에서 dynamic web project로 HelloRatpack 을 생성.

2. $webapp/WEB-INF/lib  에 위에서 생성한 build/libs 의 모든 jar 를 복사. 
cf) except servlet-*.jar , jetty-*.jar

3. web.xml 에 servlet 을 등록 

  <servlet>

    <servlet-name>Ratpack</servlet-name>

    <servlet-class>com.bleedingwolf.ratpack.RatpackServlet</servlet-class>
    <init-param>
      <param-name>app-script-filename</param-name>
      <param-value>hello.groovy</param-value><!--  WEB-INF/lib/xxx.groovy  -->
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Ratpack</servlet-name>
    <url-pattern>*</url-pattern>
  </servlet-mapping>
이경우 app-script 파일의 위치는 WEB-INF/lib  으로 고정됨. 

따라서 원하는 곳으로 수정하려면... RatpackServlet 을 상속받아서 하나 만듭니다.
ex) 
class RatpackExtendServlet extends RatpackServlet{
void init() {
if(app == null) {
def appScriptName = getServletConfig().getInitParameter("app-script-filename")
 def fullScriptPath = getServletContext().getRealPath("WEB-INF/${appScriptName}")
app = new RatpackApp()
app.prepareScriptForExecutionOnApp( fullScriptPath )
}
mimetypesFileTypeMap.addMimeTypes(this.class.getResourceAsStream('mime.types').text)
}
  }
}
cf) mime.types 파일도 위 클래스와 같은 위치에 있어야 합니다. (없으면 에러 나죠.. )
cf) 새로 만들었으면 web.xml 의 servlet-class 이름도 바꿔주어야 합니다. 이제부터는 application groovy 파일을 WEB-INF 아래부터 원하는 경로로 배치하면 됩니다. ( WEB-INF 밑으로 잡은 이유는... 웹에서 직접 접근이 안되는 곳이니까요. )
    <servlet-class>com.yourcompany.yourpkgname.RatpackExtendServlet</servlet-class>
      <param-value>ratpack/hello.groovy</param-value><!--  WEB-INF/ratpack/hello.groovy  -->
4.  write your application 
ex) /WEB-INF/ratpack/hello.groovy
set 'port', 8282  // jetty 에서 쓸때만 적용됨. 
get("/") {
    def ua = headers['user-agent']
    "Hello, World! ${ua}"
}
get("/person/:personid") { // path parameter sample
"This is the page for person ${urlparams.personid}"
}
get("/person"){ // paramter sample
"this is your param ${params}"
}

hello.groovy  파일이 바로 ratapck application



5. 배포 및 테스트 (war로 만들어도 됨.)
ant task
<target name="ratpack-deploy">
<war destfile="dist/${ant.project.name}.war" webxml="${web.dir}/WEB-INF/web.xml">
<fileset dir="${web.dir}">
<exclude name="**/*test/**"/>
</fileset>
</war>
</target>

6. 확인.
앗 썰렁해. 

기타. 에러페이지는 다음과 같습니다.  ( def x = 1 /0 ; 을 실행하게 했음. ) 



- 평가
GOOD : 
쉽고 가볍다.  (Grails는 Spring Hibernate 같은 거인들 위에 올라타 앉아서 보기엔 쉽지만 까보면 복잡하다는 단점이 있다. 사실 그 모든기능이 필요하진 않을수도 있는데.)
간단한 REST SERVICE 만들때 편하겠다. 
앞으로 성장 가능성이 있다. 

BAD : 
URL 바인딩이 늘어날 경우 한개 파일에 들어가 복잡해진다. (  당연히 분리/모듈화가 진행될듯) 
아직 베타라서 장난감 수준이 아닌가 싶다. Sinatra 수준이 되려면 좀 걸리겠다. 
충분히 성장할 수 있을까? 글쎄... ratpack 자체는 아닐 수 있지만 경량화는 추세인듯. 

ANOTHER THINKING:
최근의 기술 경향은 유연하고 확장성 있는 범용 시스템을 제공하기보다는,
특정 도메인의 필요에 따라 적절한 기능과 성능을 제공하는 SMART한 시스템을 추구하는 경향이 보인다. 
Ratpack도 그렇고, 이벤트방식의 vert.x 도 그렇고... 
기술 트렌드에 대해 계속 관심을 가져야 겠다는 생각을.... 

참고자료 : 
Presentation : Ratpack ( Classy and Compact Groovy WebApps ) - JamesWilliams
동영상 : http://www.infoq.com/presentation/Ratpack 

posted by smplnote
2012. 4. 16. 08:54 IT

- WHY?


gradle의 멀티 플로젝트 설정 가이드를 따라가면 늘 최상위 경로에 settings.gradle 을 구성하게된다.

당연히 전체 프로젝트에 대해 계층적인 구조를 가져가는 것이 상식이다.

하지만 eclipse 관점에서만 볼때, 모든 프로젝트는 항상 같은 레벨에서 관리가 된다. 

때문에 상위 경로에서 멀티 프로젝트를 관리하는 개념을 도입할때 어떻게 해야 할지 고민하게 된다.

eclipse project 단위로 형상을 관리할 경우, 상위 경로에 있는 멀티프로젝트 설정파일은 버전관리 대상에서 제외 되어 버리기 때문이다. 


물론... gradle user guide에서 설명을 안했을 뿐이지, 멀티프로젝트 관리를 반드시 계층적으로 해야 하는 것은 아니다. 


다음과 같이 설정할 수 있다.


- project-emma : multi-project관리용 root project

   settings.gradle

   build.gradle

- project-navi : child project 1. Type : java library

   build.gradle

- project-bovary : child project 2. Type: web application. it depends on project-navi

   build.gradle


[$project-emma/settings.gradle]

// define projects

include 'navi', 'bovary'


// define sub-projects location

project(':navi').projectDir = new File(rootDir, '../project-navi')

project(':bovary').projectDir = new File(rootDir, '../project-bovary')

[$project-emma/build.gradle]
// define subproject configuration
subprojects{
// define plugins
apply plugin: 'java'
repositories {
mavenCentral()
}
// set compile encoding
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
}
[$project-navi/build.gradle]
jar {
destinationDir = file("dist"); // 별도 위치에 저장하고 싶을 경우에만 명시.
}
[$project-bovari/build.gradle]
apply plugin: 'war' // compile -> war -> assemble
dependencies {
compile project(':navi') // navi project에 대한 의존성을 명시.
 }

당연하지만, 멀티프로젝트 관리용으로 빈 프로젝트를 만들어야 할 필요는 없다. (navi의 하위 경로에 지정해도 가능하다는 말임) 앞으로도 유용하게 사용할 수 있을 듯 싶음. 


posted by smplnote
2012. 1. 13. 16:51 IT

- 준비물
JDK 1.6.X
STS  (현재버전 2.9.0 M1) 

- 설치 
1. STS 실행후 Dashboard의 Extension Tab으로 가서 Grails 와 Grails Support 를 추가로 설치.
컴파일러를 groovy 1.8로 바꾸려면 Groovy Eclipse 플러그인을 다시 추가해야한다 . (이거 dependency 걸어서 같이 받게좀 해주세요.. )
참조 :  http://grails.org/STS+Integration 

2. STS재실행후  grails 홈 설정 ( STS 실행경로 바로 상위에 grails-2.0.0 이 생김. )

3.  http://grails.org/Quick+Start   따라하면 됨.. 

cf) H2 메모리 DB를 이용해서 테스트할때 좋은건 Grails가 DB web 콘솔을 기본으로 제공한다는것 ( 2.0 소개 스크린캐스트에서 발견..) 이때 jdbc url은 conf/DataSource.groovy 파일에 있는 설정값을 이용하면 된다. 


ps. 왠지 그레일즈는 설치해서 튜토리얼 한번 해보고 뭐좀 더 해보려다가 멈추게 된다.
진중하게 좀 파고들어야 하는데...
그리고 STS는 왤케 느리냐..  
다음엔 grails의 spring security 아니면  spring-security-facebook  을 조금 건드려볼까함.. 

posted by smplnote
2011. 8. 19. 11:42 카테고리 없음
CODENARC
Tool > Static Analysis
저자 : Chris Mair
홈페이지  : http://codenarc.sourceforge.net/


CodeNarc analyzes Groovy code for defects, bad practices, inconsistencies, style issues and more.

[LICENSE] Apache License V2.0  


[requirement]
groovy 1.7
java 1.5 or later
log4j 1.2.13 or later


eclipse plugin 
Supported Eclipse versions: 3.5, 3.6 and 3.7
http://codenarceclipse.sourceforge.net/ 
posted by smplnote
2011. 5. 23. 21:52 IT
hellios 는 기존의 link 디렉토리 대신 dropins 를 제공한다.

내가 사용한 방식은 다음과 같다.

eclipse/dropins/myplugin.link

파일 내용은 아래와 같다. 주의할 점은 디렉토리 구분자가 항상 / 인것. 
path=f:/dev/myplugin

실제 플러그인이 위치하는 곳의 구조는 아래와 같다. 
(지정된 path 아래에 eclipse/plugins , eclipse/features 가 있으면 된다.)
f:/dev/myplugin/eclipse/plugins/xx.jar

posted by smplnote