블로그 이미지
포도알77
IT 방랑기

calendar

      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  

Notice

2019.04.14 19:38 프로그래밍/Java

1. 그래프 데이터 베이스 neo4j

 요즘 너무 다양한 데이터 베이스가 많다. 가장 많이 들어봤을 법한 데이터베이스는 mySQL일 것이다. neo4j와 달리 mySQL은 관계형 데이터 베이스이다. neo4j는 그래프형태로 소셜 네트워크와 같이 그래프 (노드와 링크)를 표현하는데 매우 효율적이다.

 만약 관계형 데이터 베이스를 이용하여, 그래프를 표현하려면 계속해서 join을 실행해야 하는데, 관계형 데이터 베이스를 사용해본 사람이라면 얼마나 비효율적인지 알 수 있을 것이다.

 비록 간단한 프로그램이지만, neo4j를 사용한다는 생각으로 간단하게 설치와 java 연동을 해보자.

2. neo4j 설치 방법

neo4j의 사이트는 아래의 링크와 같다.

https://neo4j.com/

 

 

 다운로드 위치는 처음 홈페이지를 들어가서 보이는 download를 선택해도 좋고,  다운로드 바로가기를 선택하여 이동하여도 좋다.

여기서 개인용 neo4j와 기업용 neo4j로 나뉘는데, 개인용 (community)를 선택하자.

NEO4J - 서버 x64 WIN

 다운 받은 neo4j 인스톨러는 서버 프로그램으로, 각 데이터 베이스의 admin 페이지와 같다고 생각하자. 여기서 쿼리를 실행할 수도 있고, 데이터도 볼 수 있다. 다만!! 서버 프로그램과 자바에서 동시에 db 접근할 수 없는것은 함정이다. (썩었다.)

 다음으로는, Java에서 사용할 라이브러리 (기존 JDBC와 같은 드라이버라고 생각하면 된다.)를 다운 받아야 한다. 하지만, 나는 어디서 받는지 모르겠다. 그냥 여기서 다운받자. 속도도 더 빠를 것이다.

NEO4J - JAVA DRIVER

3. Java eclipse와 연동 방법

다운받은 neo4j 자바 드라이버 파일 압축을 풀고 이클립스에서 라이브러리를 추가하자.

 

posted by 궁금한 포도알77
2019.03.04 16:08 프로그래밍/서버

 서버를 만들다 보면 NPM 패키지에 포함되지 않은 기능이 필요한 경우가 생긴다.

 이런 경우, 어쩔수 없이 다른 프로그래밍 언어를 사용해야하는 경우가 발생한다. 또한 성능 문제로 반드시 C,C++를 써야하는 경우가 생기기도 한다. 

 Node.js에서 타 언어 프로그램을 호출하는 경우 여러가지 방법이 있지만, 나의 경우에는 한가지 프로그램만 실행하면 되었기 때문에 child_process 패키지의 exec를 사용했다. (터미널 터맨드와 동일) 


 (1) STDOUT을 이용한 처리 방법

 물론 이 방법은 터미널 명령이기 때문에 위험하다. (하지만.. 뭐 소스가 변조되지 않는 이상은 문제가 없을 것이고, 이미 변조 단계에 들어섰다면 서버 소스와 DBMS 정보를 다 털린것과 다름없기 때문에..)
  
 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 로드 시간이 적은지는 모른다. 

다만 훨씬 더 코드가 깔끔해지는 것은 확실하다.

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 에러가 발생하면 아래와 같이 설치를 시도하자.

  

sudo npm install java --unsafe-perm=true --allow-root


 그리고 jar 파일의 FilePath값을 지정하고, 이를 java.classpath.push함수에 전달하여 입력한다.
 그런 다음 java.import를 통해서 패키지를 import하고 인스턴스를 생성한다.

 이후 java 프로그램에서 정의한 함수 뒤에 Sync를 붙여주면, 해당 함수와 동기화되어 함수 종료후 그 결과를 리턴해준다.  



posted by 궁금한 포도알77
prev 1 next