2010년 5월 14일 금요일

Java - Groovy 연동

Groovy Homepage: http://groovy.codehaus.org/

Groovy Eclipse plugin : eclipse 3.5 http://dist.springsource.org/release/GRECLIPSE/e3.5/


Java 어플리케이션에서 groovy 스크립트를 호출하는 방식은 아래와 같다.

  • groovy 메서드 호출

  • 인터페이스를 구현한 groovy 객체의 메서드 호출

  • groovy 스크립트 엔진 호출



groovy 메서드 호출

아래와 같이 groovy 클래스를 작성한다.
groovy-eclipse를 설치하면 New 메뉴를 이용하여 groovy 클래스를 생성할 수 있다.



package groovy.sample

class Greetings {
static void main(def args) {
def mygreetings = "Hello Groovy World"
println mygreetings
}
}



위와 같이 작성한 후 Greetings.groovy 파일을 선택한 후 우측 마우스 버튼을 클릭하여 컨텍스트 메뉴에서 Run As 하위의 Groovy Script를 호출한다. groovy의 main메서드는 java의 main메서드와 기능적으로 일치한다.
위 groovy 스크립트를 호출하면 콘솔화면에 Hello Groovy World라고 출력된다.
위 스크립트를 자바 클래스에서도 호출할 수 있다.

JUnit 4 스타일의 테스트 메서드를 작성하면 아래와 같다.


package groovy.sample.test;

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;

import java.io.File;

import org.junit.Test;

public class GroovyTest {

@Test
public void testGreetings() throws Exception {
ClassLoader parent = this.getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File("src/groovy/sample/Greetings.groovy"));
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("main", args);
System.out.println("success");
}

}


위 코드에서 한가지 주의할 점은 parseClass 메서드에 파일명을 문자열로 주면 안된다는 것이다.
parseClass의 파라미터에 문자열이 전달되는 경우는 groovy script의 내용이 전달되는 경우다.
위 메서드를 실행하면 콘솔화면에 아래와 같이 출력된다.

Hello Groovy World
success


인터페이스를 구현한 groovy 객체 호출
아마도 실제 개발환경에서 많이 사용되는 케이스가 아닐까 생각한다. 인터페이스 뿐만 아니라 추상클래스를 상속받아 구현할 수도 있다.

인터페이스 예제

package mybiz.service;

public interface MyService {
String sayYourName();
}



groovy 구현 클래스 1

package groovy.sample

import mybiz.service.MyService;

class GroovyService implements MyService {

/* (non-Javadoc)
* @see mybiz.service.MyService#sayYourName()
*/
@Override
public String sayYourName() {
return "My name is groovy";
}
}



groovy 구현 클래스 2

package groovy.sample

import mybiz.service.MyService;

class DukeService implements MyService {

/* (non-Javadoc)
* @see mybiz.service.MyService#sayYourName()
*/
@Override
public String sayYourName() {
return "My name is duke";
}
}



테스트 케이스

package groovy.sample.test;

import java.io.File;

import groovy.lang.GroovyClassLoader;

import mybiz.service.MyService;

import org.junit.Test;

public class ServiceTest {

@Test
public void testService() throws Exception {
ClassLoader parent = this.getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = null;
groovyClass = loader.parseClass(new File("src/groovy/sample/GroovyService.groovy"));
MyService groovyService = (MyService) groovyClass.newInstance();
System.out.println(groovyService.sayYourName());

groovyClass = loader.parseClass(new File("src/groovy/sample/DukeService.groovy"));
MyService dukeService = (MyService) groovyClass.newInstance();
System.out.println(dukeService.sayYourName());

}
}



위와 같이 실행하면 콘솔화면에 아래와 같이 출력된다.

My name is groovy
My name is duke


스크립트 엔진을 이용하여 groovy script 실행
velocity와 같이 문자열을 치환하는 스크립트를 실행하는 예제를 살펴보자.

groovy 스크립트를 src/groovy/sample/hello.groovy 로 아래와 같이 생성한다

message = "hello, ${name}!"
introduction = "my name is ${name}. I'm ${age} years old"




package groovy.sample.test;

import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;

import org.junit.Test;

public class ScriptEngineTest {

@Test
public void testGroovyScriptEngine() throws Exception {
String[] urls = new String[] { "src/groovy/sample" };
GroovyScriptEngine scriptEngine = new GroovyScriptEngine(urls);
Binding binding = new Binding();
binding.setVariable("name", "duke");
binding.setVariable("age", 25);
scriptEngine.run("hello.groovy", binding);
System.out.println("message: " + binding.getVariable("message"));
System.out.println("introduction: " + binding.getVariable("introduction"));
}
}



위 테스트 케이스를 실행하면 콘솔화면에 아래와 같이 출력된다.
message: hello, duke!
introduction: my name is duke. I'm 25 years old

댓글 없음:

댓글 쓰기