그루비(Groovy)에 날개를 달아주는 그레이프(Grape) Java / Groovy

나는 자바를 무척이나 좋아하는 사람이지만, 스크립트 언어인 그루비는 계륵같은 존재였다. C 기반 스크립트 언어들에 비해 어딘지 길고 복잡한 패키지와 메서드들, 반드시 자바가 설치되어있어야 동작한다는 한계들로 인해 활용도가 떨어져 보였기 때문이다. 사실 따져 보면 앞의 제약은 내가 작업하는 환경들이 대부분 자바 서버들이므로 별 문제가 아니고, 활용도는 플레이 프레임웍(Play Framework)과 간트(Gant), 그래들(Gradle)에서 사용되는 것만 보아도 충분히 배워둘 가치가 있다고 할 것이다. 그러나 막상 스크립트 언어로서 적극적으로 사용해보려고 해도 끝까지 걸리는 것 한가지는 의존성이었다. 리눅스 소스 리스트에서 찾을 수 있는 수많은 python, perl의 모듈들에 비해 그루비 패키지들은 찾을 수가 없었고 간단한 스크립트 하나 돌리자고 ivy/maven을 이용하거나 인터넷에서 직접 jar를 받아 패키지들을 클래스 패스에 넣자니 생각만으로도 여간 귀찮은 일이 아니었다.

그러나 더 찾아보니 놀랍게도, 그루비는 이에 대한 해답을 이미 제시하고 있었다. 바로 그레이프와 비교적 최근에 추가된 @Grab 어노테이션이 바로 그것이다. 다음 코드를 보자.

#!/usr/bin/env groovy
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.1')

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.Method.GET
import static groovyx.net.http.ContentType.TEXT

def http = new HTTPBuilder('http://www.naver.com/')

http.get(
  path: '/',
  contentType : TEXT,
  query : [q:'Groovy']
){ 
  resp, reader ->
    println "response status:  ${resp.statusLine}"
    println "response data: -----"
    System.out << reader
    println '\n-------------------'
}

네이버에 접속해 내용을 출력해주는 무척 간단한 스크립트인데, 여기서 사용하는 HTTPBuilder 클래스는 그루비 기본 패키지에 포함되지 않으므로 인터넷에서 받아서 구해야 한다. 만약 두번째 줄의 @Grab 어노테이션이 없었다면, 이 코드는 꼼짝없이 ClassNotFound 에러를 내뱉었을 것이다. 그러나 이 한줄 때문에 스크립트는 무사히 실행된다.

만일 그루비의 버전이 1.7 이하라면 이 코드는 제대로 실행되지 않을 수도 있다. 그리고 처음 실행시는 조금 시간이 걸리는데, 특별한 에러가 없다면 의존성이 걸린 패키지들을 다운로드 하는 것이다. 시스템 모니터의 네트웍 상태를 점검하거나 홈 디렉터리의 .groovy/grapes/ 로 이동해보자. 그레이프는 내부적으로 앤트의 아이비를 이용해 메이븐 저장소에서 각종 클래스들을 다운로드하고 실행할 것이다.

다만 한 가지 남아있는 문제가 있다. 특별히 설정을 바꾸지 않았다면 이 스크립트를 두 번째 실행할 때도 (첫 번째보다는 조금 덜하지만) 여전히 적지않은 시간을 응답없는 프롬프트를 보며 기다려야 할 것이다. 기본 설정으로는 매번 실행시마다 각 저장소에 접속해 최신 버전이 없는지 검색하기 때문이다.

이 설정을 바꾸려면 grapeConfig.xml을 바꿔야 한다. ~/.groovy/grapeConfig.xml 파일을 수정하되 없으면 wget http://svn.codehaus.org/groovy/tags/GROOVY_1_7_10/src/main/groovy/grape/defaultGrapeConfig.xml -O grapeConfig.xml 해서 내용을 가져온다. 그 다음 <ivysettings> 아래에 다음 행을 추가한다.

<property name="ivy.cache.ttl.default" value="15m"/>

시간은 각자 적절히 수정하도록 한다. 이렇게 해 두면, 재실행시의 실행 시간이 단축될 것이다.

위의 팁은 아래 주소에서 가져왔다 :
http://groovy.329449.n5.nabble.com/Grab-is-Unusably-Slow-td371278.html

이렇게 패키지를 자동으로 받도록까지 해 두니 그루비 스크립트의 활용도가 무궁무진해졌다. 이것으로 무엇을 할 지는 이제 각자의 몫이다.

Tag :
, , , , , ,

Leave Comments