개발 관련/Java

JAVA 에서 javascript (ECMA script) 실행하기.

snoworca 2016. 5. 23. 11:20


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