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