JAVA 에서 javascript (ECMA script) 실행하기.
JAVA6 부터 자바 스크립트 엔진을 기본적으로 지원한다.
(ps, 안드로이드에서는 자바 스크립트 엔진이 직접 포함되지 않는다. 그렇기 때문에 RhinoScriptEngine 프로젝트를 직접 적용해야 한다. https://github.com/mozilla/rhino)
JAVA8 미만은 RhinoScriptEngine 을 사용하며, 8 버전에서는 NashornScriptEngine 을 사용한다.
하지만 사용방법은 동일하다.
물론 각 브라우저에서 사용할 수 있는 자바 스크립트 API 는 제공되지 않는다.
아래 예제는 콘솔을 통하여 두 수를 입력 받아 각각 함수와 객체를 이용하여 덧셈을 하고 그 결과 값을 출력해 주는 코드다.
test.js :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | function calc() { try { console.print("첫 번째 값 : "); var param1 = console.readInt(); console.print("두 번째 값 : "); var param2 = console.readInt(); } catch(e) { console.println("32 바이트 정수를 입력해 주세요."); e.printStackTrace(); return; } var result = sum(param1, param2); var calc = Calculator.newInstance(); console.print("결과 (function 이용) : "); console.println(param1 + " + " + param2 + " = " + sum(param1, param2)); console.print("결과 (object 이용) : "); console.println(param1 + " + " + param2 + " = " + calc.sum(param1, param2)); function sum(val1, val2) { return val1 + val2; } } calc(); |
위 자바 스크립트 코드를 보면 생소한 API 들이 보일 것이다.
아래 자바 코드 예제에서 보면 객체를 자바 스크립트의 객체 이름을 자바의 객체와 맵핑을 시켜놓았다는 것을 알 수 있을 것이다. 자바 객체의 내부 메소드도 함께 맵핑된다.
즉, 자바 스크립트 API 를 입맛대로 만들어서 적재적소에 사용할 수 있다.
물론 떨어지는 성능은 감안해야 한다.
Preview:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.Scanner; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleBindings; public class ScriptTest { public static void main(String[] args) throws ScriptException, FileNotFoundException { File js = new File("./test.js"); FileReader JsfileReader = new FileReader(js); ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Bindings bindings = new SimpleBindings(); bindings.put("console", new Console()); bindings.put("Calculator", new Calculator()); engine.eval(JsfileReader, bindings); } public static class Calculator { public int sum(int val1, int val2) { return val1 + val2; } public Calculator newInstance() { return new Calculator(); } } public static class Console { public int readInt() { Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); return Integer.parseInt(line); } public void print(String line) { System.out.print(line); } public void println(String line) { System.out.println(line); } } } |
결과는 아래와 같다.
첫 번째 값 : 123
두 번째 값 : 456
결과 (function 이용) : 123 + 456 = 579
결과 (object 이용) : 123 + 456 = 579