[Groovy] INDY(InvokeDynamic) 버전 사용하기

InvokeDynamic 자체가 좀 어렵다.

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html#invokedynamic

골자는 자바7에 이 기능이 추가됐고 이걸 잘 사용하면 JVM 기반의 동적 언어 시스템에 필요한 컴파일러와 런타임 구현체를 개선할 수 있다는데… 그냥 쓰면 좋다. 정도로 넘어가야겠다.

기존 JDK instruction 중에 invokevirtual에 상반되는 invokedynamic이라는 걸 추가했고 그걸로 동적 언어 구현체를 만들 수 있는 기능인가보다. 이걸 사용해서 구현하면 JVM 기반 동적 언어 컴파일러나 런타임 구현이 좀 더 간편하고 성능도 개선할 수 있고.

좀 더 깊게파려면 dynamic call site, bootstrap 등이 뭔 말인지 이해해야겠지만 뭔 말인지 모르겠다.

A dynamic call site is originally in an unlinked state, which means that there is no method specified for the call site to invoke

정의를 봐도 모르니 이해할 방법이 없다. 패쓰.

http://groovy.codehaus.org/InvokeDynamic+support

여기 잘 설명이 되어이는데 대충 이런 내용이다. 그루비 2.0 부터는 JVM의 invokedynamic 이라는 instruction을 지원하는 기능을 추가했단다. 그런데 이 instruction은 Java 7부터 지원되는 거라서 당근 JDK 1.7 이후부터 사용할 수 있다.

그렇다고 자바 7 쓰고 있으면 기본으로 쓰는건 아니고 groovy-x-y-x-indy.jar 처럼 맨 뒤에 indy가 붙은 jar 파일들을 사용해야지 invokedynamic으로 구현된 라이브러리를 사용할 수 있다.

indy 파일들은 그루비가 설치된 디렉토리/indy라는 곳에 들어있다. 그루비쉘 등에서 기본으로 사용하는 라이브러리는 그루비 홈/lib에 들어있는데 여기 들어있는건 당근.. 뭘까? indy가 아니라 normal이다.

그래서 이걸 굳이 indy 버전으로 쓰고 싶은 나같은 JDK 7 이상 버전 사용자들은 다음과 같은 쉘을 “그루비 홈”에서 실행해주면 한방에 lib 디렉토리에 들어있는 jar 들을 indy로 바꿔준다.

for f in `ls lib/groovy*.jar | cut -d/ -f2`;do k=`basename $f .jar`; mv lib/$k.jar lib/$k.jar.old; cp indy/$k-indy.jar lib/$k.jar ; done

파일이 한두개가 아니라서 수작업으로 indy에 있는걸 옮기지말고 그냥 위에 스크립트 복사해서 실행하는게 좋다.

그리고 사용자가 작성한 그루비 스크립트도 컴파일 할 대 invokedynamic을 사용하도록 컴파일 하려면 indy 옵션을 줘야 한다는데 옵션을 어떻게 줘야 하는지 예제가 없네.

http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.compile.GroovyCompileOptions.html#N1BA24

그래들로 그루비 컴파일 옵션 주는 방법은 여기있는데.. 보통 IDE에 세팅해놓고 쓰는게 좋을텐데 흠.. 어디없나. 모르겠다 패쓰!

Grails(is Spring) 시작하기

0. 일단 http://www.grails.org/Home 여기로 가서 홈피 구경을 합니다.

1. 다운로드하러 갑니다. 이때 주의 할 건 맨 위에 보이는 1.0.4가 아니라 1.1.0 베타1을 받습니다.

2. 압축을 풀고 Grails 홉 디렉터리를 GRAILS_HOME으로 환경변수에 추가하고 PATH에는 GRAILS_HOME/bin을 추가해줍니다.

3. 콘솔에서 grails help를 입력해 봅니다.

=> 화면에 뭔가 잘 뜨면 Grilas 준비 끝 납니다. 이젠 이클립스를 조금 준비해 줍니다.

4. 이클립스를 켜고 Groovy 플러그인을 받아서 설치합니다. http://dist.codehaus.org/groovy/distributions/update/ 업데이트 사이트를 이용할 수 있습니다.

5. Preference -> Java -> Build Path -> Classpath Component인가(?) 에 new 를 클릭하고 GRAILS_HOME 환경 변수를 등록해 줍니다.

=> 이클립스 준비 끝. 이젠 Grails 퀵스타트를 보면서 프로젝트를 하나 만들어 봅니다.

6. grails create-app 프로젝트이름

7. 이클립스에서 import ->  Existing Project … 로 프로젝트 로딩(Grails 프로젝트는 만들 때 기본으로 이클립스에서 인식할 수 있는 프로젝트로 만들어 줌)

8. grails create-domain-class 도메인이름

9. 이클립스에서 프로젝트 리로딩(F5)

10. 도메인 클래스에 필요한 속성 추가

11. grails generate-all

12. grails run-app

13. 브라우저에 http://localhost:8080/프로젝트이름/도메인이름/list 입력

14. 환호성.. 오오오~~~~!!!

코드가 Groovy라서 자바 코드 활용도 간단하고 코딩 스타일도 (자바 스타일이랑 거의 똑같이 해도 제대로 동작하지만) 좀 더 간결해지고 무엇보다.. 스크립트 언어 장점을 그대로 활용할 수 있다는거.. 이 말은 서버 재시작 없이 애플리케이션 변경하면 그 변경 사항이 그대로 적용된다는거… 아드리안 콜리어가 보여준 데모의 아주 일부를 해 봤습니다.

아드리안이 보여준 데모는 이 데모 전에 스프링 인티그레이션을 보여주고 위의 데모 뒤에 위 애플리케이션이랑 스프링 인티그레이션으로 만든 애플리케이션을 연동하고, 마지막으로 grails war를 사용해서 스프링 dm 서버에 설치하는 것 까지 보여줬습니다.

바램이 있다면, Grails에서 스프링 DM 개발을 빨리 지원해주면 좋겠습니다. grails bundle 같은 명령어로 쉽게 OSGi 번들로 패키징 해주면 좋겠습니다. 이런 플러긴을 만들 수 있는지 살펴보고 없으면 제가 만들어서 스프링소스에 제공해도 되겠네요. 흠~ 해볼까나~