최근 작업 중 node.js에서 java의 기능을 만들어야하는 부분이 있었다.

하지만 어떠한 이유에서인지 변환이 잘 안되었고 최후의 수단으로 그냥 해당 java부분을 호출하기로 결정하고 자료를 찾아보았다. 자료는 얼마간 있었지만 양쪽 언어를 알고 있다는 전제가 깔려있는지 성의없는 글들만 보였다.

양쪽 언어를 전혀 모르는 상태라 어찌 저찌 끼워 맞춰서 동작시킨 결과물을 여기 기록해 놓는다.

 

0. node.js 초기화

$ npm init
This utility ...
...
package name: (directory name)
version: (1.0.0)
description: 
entry point: (index.js) view_java.js
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /home.../package.json:

{
  "name": "java_es6",
  "version": "1.0.0",
  ...
  "license": "ISC"
}

Is this OK? (yes)

처음부터 끝까지 [Enter]만 눌러줘도 된다. 전부 기본설정을 유지하고 entry point를 다른 파일로 하기위해서 바꿨다.

 

1. java 파일 (Test.java)

import java.lang.System;

public class Test {
	
	private final static String sStr = "Hello, World.";

	public static String viewString (String getStr) {
		String sRes = sStr + " " + getStr;
		
		return sRes;
	}

	public static void main(String[] args) {
		
		Test pTest = new Test ();

		String sRes = pTest.viewString ("sun");
		System.out.println ("Result : " + sRes);
	}
}

main()은 단독 실행일 때만 동작한다.

 

2. .class 만들기 및 동작되는지 확인

$ javac Test.java
$ java Test
Result : Hello, World. sun

 

3. .jar 만들기

$ jar -cvf Test.jar Test.class
Manifest를 추가함
추가하는 중: Test.class(입력 = 838) (출력 = 490)(41%를 감소함)

manifest를 만들지 않고 그냥 호출했는데 여러개의 .class를 넣을 때는 main이 되는 class를 manifest에 지정을 해주어야한다. jar를 만드는 방법을 보면 쉽게 설명되어있다.

 

4. node.js 파일

CommonJS (view_java.js)

var java = require ('java');    // java 모듈 이용
var jarFilePath = __dirname + '/Test.jar';  // 경로 지정(중요)

java.classpath.push (jarFilePath);  // jar 파일 읽기

var progInstance = java.import ('Test'); // class instance 가져오기
var res = progInstance.viewStringSync ('Moon'); // class의 함수 호출하기(Sync 붙이기)
console.log ({ res }); // 결과 출력

ES6 (view_java.mjs)

import path from "path";
import java from "java";

const __dirname = path.resolve ();
var jarFilePath = __dirname + 'Test.jar';

java.classpath.push (jarFilePath);

var progInstance = java.import ('Test');
var res = progInstance.viewStringSync ('Moon');

console.log ({ res });

 

node에서 java의 class에 있는 function을 호출할 때 주의점은 '...Sync'를 붙여서 호출해야 한다는 점이다.

즉, 자바에서의 이름은 viewString() 이지만 node에서 호출할 때는 뒤에 Sync를 붙여 viewStringSync()로 호출해야만 호출이 가능하다.

원래 의도가 암호와 관련된 호출이였기에 java파일에 import javax.crypto.Cipher와 같은 import가 있었는데 이것 역시 호출이 가능했다. 따라서 경로만 잘 맞춰주면 package에 관련된 jar도 무리없이 호출 가능할 것으로 생각된다.

jar만들 때 main으로 등록된 class이름을 import해주면 될 것으로 생각한다.

ES6에서는 __dirname이 기본으로 안되어있으니 path를 이용해서 __dirname을 만들어주면 된다.

 

5. 필요한 모듈 설치

$ npm install java

 

6. 실행

CommonJS

$ node view_java.js
{ res: 'Hello, World. Moon' }

ES6

$ node view_java.mjs
{ res: 'Hello, World. Moon' }

4번의 설명에서 언급했듯이 ...Sync부분이 제일 중요한 부분이다. 사실 이부분 때문에 기록을 남겨둔다.

 

P.S.: 기존 CommonJS 형식으로만 기록했었는데 추가적으로 ES6 형식이 필요하여 테스트 후 기록한다.

 

'컴퓨터' 카테고리의 다른 글

PlatformIO in VSCode error  (0) 2023.07.27
warning: BASE64Decoder  (0) 2022.08.17
MacOS FileZilla 대기파일 삭제  (0) 2022.01.12
저항값 보기  (0) 2019.09.20
XPlanet의 추억  (1) 2019.04.06
Posted by codebank
,