일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MYSQL
- 안드로이드
- FIDO2
- apple
- otpkey
- fido
- 애플
- Xcode
- 앱스토어
- git
- appres
- 앨범북
- SwiftUI
- 인증
- kmip
- SWIFT
- MFA
- 2FA
- Nodejs
- css
- Android
- OTP
- WebAuthn
- MSYS2
- SSH
- OSX
- SSL
- 앱리소스
- albumbook
- openssl
- Today
- Total
인디노트
Node.js와 외부 프로그램(Java, C, C++) 연결 (bridge) 본문
출처 : https://fatc.club/2018/06/26/2290
서버를 만들다 보면 NPM 패키지에 포함되지 않은 기능이 필요한 경우가 생긴다.
이런 경우, 어쩔수 없이 다른 프로그래밍 언어를 사용해야하는 경우가 발생한다. 또한 성능 문제로 반드시 C,C++를 써야하는 경우가 생기기도 한다.
Node.js에서 타 언어 프로그램을 호출하는 경우 여러가지 방법이 있지만, 나의 경우에는 한가지 프로그램만 실행하면 되었기 때문에 child_process 패키지의 exec를 사용했다. (터미널 터맨드와 동일)
(1) STDOUT을 이용한 처리 방법
물론 이 방법은 터미널 명령이기 때문에 위험하다. (하지만.. 뭐 소스가 변조되지 않는 이상은 문제가 없을 것이고, 이미 변조 단계에 들어섰다면 서버 소스와 DBMS 정보를 다 털린것과 다름없기 때문에..)
1 2 3 4 5 6 7 8 9 10 11 12 | var exec = require( 'child_process' ).exec; exec( './program ./programInputRedirect.txt' , function callback(err, stdout, stderr){ if (err){ console.error(err); } //stdout 응답 : { success : true/false, data : .. } var result = JSON.parse(stdout); if (result.success){ .. } }); |
아무튼 위의 코드는 Node에서 C++ 프로그램을 실행하는 명령인데, 커맨드 명령이기에 입력 파일을 redirect 또는 직접 아규먼트로 던져줄 수 있다.
응답은 C++ 프로그램에서 stdout에 JSON 형태로 던져준다. 이후 이 결과를 Node 콜백으로 가져오며, JSON으로 파싱해서 처리하는 로직을 가진다.
(2) Bridge 방법
사실 C, C++의 경우 브릿지 할 수 있는지는 모르겠지만, Java의 경우 가능하다.
우선 개념은 개발한 Java 프로그램을 Jar 파일로 변환하고, 이 Jar 파일에서 접근 가능한 함수를 Node.js상에서 직접 호출하는 것이다.
이 방법이 위의 child_process보다 획기적으로 빠르다거나, JVM 로드 시간이 적은지는 모른다. 다만 훨씬 더 코드가 깔끔해지는 것은 확실하다.
1 2 3 4 5 6 7 | var java = require( 'java' ); var jarFilePath = __dirname+ '/path../program.jar' ; java.classpath.push(jarFilePath); var progInstance = java.import( 'program.abc.defg' )(); var result = progInstance.funcABCSync(param1,...); |
우선 java 패키지를 설치한다. jdk 1.7까지 기본적으로 지원하고, 1.8부터는 별도의 추가 설치방법이 필요하다고 한다.
만약 java 패키지 설치시 계속해서 permission 에러가 발생하면 아래와 같이 설치를 시도하자.
1 | sudo npm install java --unsafe-perm=true --allow-root |
그리고 jar 파일의 FilePath값을 지정하고, 이를 java.classpath.push함수에 전달하여 입력한다.
이후 java.import를 통해서 패키지를 import하고 인스턴스를 생성한다.
이후 java 프로그램에서 정의한 함수 뒤에 Sync를 붙여주면, 해당 함수와 동기화되어 함수 종료후 그 결과를 리턴해준다.
'개발 플랫폼 및 언어 > 노드 Node & NPM' 카테고리의 다른 글
Node.js TLS plain TLS sockets (0) | 2018.11.10 |
---|---|
Node.js: Simple TCP Server & Client and Promisify the Client (0) | 2018.11.10 |
Centos 7.x Node.js 최신버전 설치 (0) | 2018.11.05 |
[Node.js] express-session (0) | 2018.11.02 |
C++ Addon with Node.js (0) | 2018.11.02 |