Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Groovy는 매우 가볍게 설계되었으며 어떠한 자바 애플리케이션에도 쉽게 임베드될 수 있습니다.

Wiki Markup
{link:BSF|bsf.html}{link}
를 이용하면 어떠한 스크립트 언어도 자바 코드에 임베드할 수 있습니다. 하지만 Groovy는 더 가볍도 긴밀한 연동을 위한 수단을 제공합니다. 주로 다음 세 가지 방법이 사용됩니다.

쉘을 이용하여 스크립트나 표현식을 평가하기

Wiki Markup
{link:GroovyShell|apidocs/groovy/lang/GroovyShell.html}{link}
을 이용하면 어떠한 표현식이나 스크립트도 평가할 수 있고 그 결과로 만들어진 변수들을
Wiki Markup
{link:Binding|apidocs/groovy/lang/Binding.html}{link}
객체를 통해 내보낼 수 있습니다:

Code Block
java
java
// 자바 코드에서 Groovy 표현식 호출하기
Binding binding = new Binding();
binding.setVariable("foo", new Integer(2));
GroovyShell shell = new GroovyShell(binding);

Object value = shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");
assert value.equals(new Integer(20));
assert binding.getVariable("x").equals(new Integer(123));

자바에서 동적으로 Groovy 코딩을 로딩하고 실행하기

Wiki Markup
{link:GroovyClassLoader|apidocs/groovy/lang/GroovyClassLoader.html}{link}
를 통해 동적으로 Groovy 클래스를 자바 프로그램으로 로드하고 직접 실행할 수 있습니다.

다음 자바코드를 참고하세요:

Code Block
java
java
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy"));

// 인스턴스의 메서드를 호출해봅시다
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("run", args);

Groovy 스크립트가 구현하고 있는 특정 인터페이스를 사용하고자 하면 아래와 같이 할 수 있습니다:

Code Block
java
java
GroovyClassLoader gcl = new GroovyClassLoader();
Class clazz = gcl.parseClass(myStringwithGroovyClassSource, "SomeName.groovy");
Object aScript = clazz.newInstance();
MyInterface myObject = (MyInterface) aScript;
myObject.interfaceMethod();
  ...

Groovy 클래스가 MyInterface라는 인터페이스를 구현하고 있다면 위 코드는 잘 돌아갈 것입니다. 이제 myObject는 MyInterface를 구현하고 있는 다른 자바 객체들과 동일하게 쓰일 수 있습니다.

Groovy 스크립트엔진(GroovyScriptEngine)

Groovy 스크립트를 서버에 임베드하고 스크립트 수정시 리로드하기를 원하는 사람들 위한 가장 완전한 해결책은 Groovy 스크립트엔진을 이용하는 것입니다. URL이나 디랙토리 이름으로 구성된 CLASSPATH 를 이용하여 Groovy 스크립트엔진을 초기화한 후에 해당 경로 상에 존재하는 어떠한 Groovy 스크립트도 사용할 수 있습니다. GSE는 또한 스크립트 사이의 의존 관계를 추적하고 있으므로 의존 관계에 있는 스크립트가 수정될 경우 전체 트리가 자동으로 재컴파일되고 리로드됩니다.

추가로, 각 스크립트를 실행할 때 스크립트에서 접근할 수 있는 속성들을 담고 있는 Binding 객체를 넘겨줄 수 있고, 스크립트 실행 중에 변경된 Binding 객체의 모든 속성은 자바에서 접근할 수 있습니다. 아래 예제를 참고하세요:

/my/groovy/script/path/hello.groovy:

Code Block
java
java
output = "Hello, ${input}!"
Code Block
java
java
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;

String[] roots = new String[] { "/my/groovy/script/path" };
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable("input", "world");
gse.run("test.groovy", binding);
System.out.println(binding.getVariable("output"));

위 코드는 "Hello, world!"를 출력할 것입니다.

런타임 의존성

Groovy는 Java 1.4 런타임과 Groovy jar 이외에도 네 개의 jar로 구성된 ASM 라이브러리(asm-2.1.jar, asm-util-2.1.jar, asm-attrs-2.1.jar, asm-analysis-2.1.jar)에 의존하고 있습니다. 이게 전부입니다. 즉, 이 다섯개의 jar 파일을 CLASSPATH에 등록하면 애플리케이션에서 아무 문제 없이 Groovy를 임베드할 수 있습니다.

여러 jar를 등록하는 대신, GROOVY_HOME/embeddable 디랙토리에 있는 groovy-all-1.0-beta-x.jar 파일을 이용할 수도 있습니다. This jar contains both Groovy and ASM combined in a single and convenient archive, with the ASM classes in a different namespace, so conflits with other libraries also using ASM will be avoided (smile)

다음