예제로 공부하기 – Node.js를 사용하는 커스텀 쿼리로 작업하기

6 개월 ago fermat39 0

[원문 : http://insidemysql.com/develop-by-example-working-with-custom-queries-using-node-js/]

이 글의 소유권은 원저자에게 있습니다. 잘못된 번역이나 오역들은 모두 번역자의 능력문제입니다. ㅠㅠ오역 및 추가사항에 대해서 댓글 달아주시면 반영하겠습니다.

 

블로그의 이전 포스트에서 도큐먼트 스토어로서 MySQL 서버를 설정을 할 때 해야 할 것에 대한 많은 방법들을 다루었다. 모든 예제에서 MySQL 서버와 통신하기 위해 XSession을 사용하였다.

XSession은 연결을 추상화하는 논리적인 세션이다. XSession으로 1개 이상의 서버에 연결할 수 있고, 컬렉션과 릴레이셔널 테이블로 작업하기 위해 필요한 기능도 제공한다. 그러나, XSession이 제공하지 않는 뭔가가 있다. 즉, 완전한 SQL 언어지원이다.

XSession이 지원하지 않는 쿼리를 실행할 경우, 대신에 NodeSession를 사용한다. NodeSession 오브젝트는 예를들어  특정 MySQL 서버에 접속하고 이 서버에 특정한 작업을 하려하거나, 특정 함수나 스토어 프로시저를 실행하고자 할 때 유용할 수 있다.

아래 예제는 NodeSession 오브젝트를 사용하는 법을 알려준다.

var mysqlx = require('mysqlx');
mysqlx.getNodeSession({
  host: 'host',
  port: '33060',
  dbUser: 'root',
  dbPassword: 'my pass'
}).then(function (nodesession) {
  nodesession.executeSql("USE mySchema")
  .execute()
  .then(result => {
    nodesession.executeSql("SELECT * FROM myColl LIMIT 1")
    .execute(function (result){
      console.log(result[0]);
      nodesession.close();
    });
  }).catch(function (err) {
    console.log(err.message);
    console.log(err.stack);
  });
});

위 예제에서, NodeSession 오브젝트 (nodesession)을 얻기 위해 getNodeSession 메소드를 사용한다. 그 다음에 우리가 사용할 스키마를 설정하기 위해 nodesession 오브젝트의 executeSql 메소드를 호출한다. 쿼리를 실행하기 위해 execute 메소드를 호출한다. 현재 데이터베이스를 지정하는 쿼리 실행이 완료되면, 쿼리 실행에 대한 정보를 가지고 있는 Result 오브젝트 (result)를 반환한다. 이 인스턴스에서 result 오브젝트는 실행에 대한 성공 및 실패 여부를 알려주는 것외에는 어떠한 유용한 정보를 가지고 있지 않는다. 다시 1개의 레코드를 반환할 수도 있는 쿼리를 가진 executeSql 메소드를 호출한다. 일단 쿼리가 실행되면, result 오브젝트가 반환되고, 예제의 경우는 result  오브젝트에 배열 오브젝트로 반환되는 레코드를 포함한다. 배열에서 각 항목들은 각 레코드컬럼이다. 우리가 필요한 정보를 얻기 위해 배열 오브젝트 접근시 인덱스를 사용한다.  위 소스코드는 컬럼 0 (인덱스 0)의 값을 얻어 콘솔에 그 값을 출력한다.

물론, NodeSession 오브젝트를 사용하지 않고도 앞 예제는 실행될 수 있다. 그래서 다음 예제에서는 XSession 오브젝트로 다룰 수 없는 좀더 복작한 쿼리를 생성할 것이다.

영화평과 평가를 저장하는 컬렉션을 가지고 있다고 해보자. 영화의 평점을 기반으로하여 상위 10개의 영화를 찾고자 한다. 현재, XSession 오브젝트를 이용한 평균 계산이 지원되지 않는다. 이 경우 NodeSession이 필요하다.

다음 예제는 앞서 이야기한 우리가 원하는 것을 얻는 방법을 보여준다.

var mysqlx = require('mysqlx');
mysqlx.getNodeSession({
  host: 'host',
  port: '33060',
  dbUser: 'root',
  dbPassword: 'my pass'
}).then(function (nodesession) {
  var query = 'select movie_name from' +
  ' (select  JSON_EXTRACT(doc, "$.movie_name")'+
  ' as movie_name, round(avg(JSON_EXTRACT(doc,' +
  ' "$.rate")), 2) as average from mySchema.reviews' +
  ' group by movie_name) as bestrated' +
  ' order by average desc limit 10;';

  const execSql = nodesession.executeSql(query);
  execSql.execute(function (result) {
    console.log(result[0]);
  })
  .catch(function (err) {
    console.log(err.message);
    console.log(err.stack);
  });
  nodesession.close();
}).catch(function (err) {
console.log(err.message);
console.log(err.stack);
});
위 예제에서 NodeSession 오브젝트 (nodesession)을 얻는다. 그 후 실행하고자 하는 쿼리를 정의하기 위해 nodesession 오브젝트의 executeSql 메소드를 호출한다. 예제에서 보시다시피, 사용할 스키마를 설정하지 않지만 쿼리(mySchema.reviews)에서 스키마를 지정한다. 쿼리가 실행되면 콘솔에 결과를 출력하고 node 세션이 닫힌다.
쿼리에서 “JSON_EXTRACT“라는 함수를 사용하는 것을 볼 수 있을 것이다. 이 함수는 JSON 문서를 생성 및 조회하도록 하기 위해 MySQL 서버 5.7에 도입된 많은 함수중에 하나이다. MySQL 서버 5.7에 도입된 함수들에 대한 정보는 MySQL 레퍼런스 가이드 JSON FunctionsManipulation JSON Data를 참조한다.

그럼 다음 블로그에서 만납시다.