ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node MySQL2
    Node.js/백엔드 2020. 1. 30. 01:18

    npm install --save mysql2

    Node MySQL2

    기본적인 쿼리

    // MySQL 클라이언트 가져오기
    const mysql = require('mysql2');
    
    // 데이터베이스와 연결
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      database: 'test'
    });
    
    // 간단한 쿼리
    connection.query(
        'SELECT * FROM `table` WHERE `name` = "Page" AND `age` > 45',
      function(err, results, fields){
        console.log(results); // results는 서버로부터 반환된 행들을 포함한다.
        console.log(fields); // fields는 results에 관한 부가적인 메타데이터들을 포함한다.
      }
    );
    
    // placeholder와 함께
    connection.query(
        'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
      ['Page', 45],
      function(err, results){
        console.log(results);
      }
    );

    준비된 명령문

    MySQL2에서는 준비된 명령문(prepared statements)을 사용할 수 있다. 준비된 명령문으로 MySQL은 동일한 쿼리를 위해 매번 계획을 준비할 필요가 없고, 성능이 더 좋아진다.

    MySQL은 statement를 준비하고 쿼리하는 execute helper를 제공한다. 또한 prepare / unprepare 메서드를 통해 직접 statement를 준비하거나 준비하지 않을 수 있다.

    const mysql = require('mysql2');
    
    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      database: 'test'
    });
    
    // execute는 내부적으로 prepare와 query를 호출한다.
    connection.execute(
        'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
      ['Rick C-137', 53],
      function(err, results, fields){
        console.log(results);
        console.log(fields);
      }
    
      // 만약 같은 statement를 실행(execute)한다면, LRU 캐시로부터 불려올 것이다.
      // 그로 인해 쿼리 준비 시간을 아낄 수 있고 성능도 좋아진다.
    );

    connection pool 사용

    커넥션 풀(connection pools)들은 이전의 connection을 재사용하고, connection 사용 후 open 상태로 내버려두어 MySQL 서버와 연결하는 데 소모되는 시간을 감소시킨다.

    새로운 connection을 구축할 때 생기는 오버헤드를 모두 피할 수 있으므로, 쿼리의 지연시간을 향상시킨다.

    const mysql = require('mysql2');
    
    // connection pool을 생성한다. pool-specific setting들은 디폴트다.
    const pool = mysql.createPool({
      host: 'localhost',
      user: 'root',
      database: 'test',
      waitForConnections: true,
      connectionLimit: 10,
      queueLimit: 0
    });

    풀은 모든 connection을 미리 생성하지는 않지만, 필요에 따라 connection limit에 도달할 때까지 connection을 생성한다.

    또한, 풀은 connection처럼 사용할 수 있다(pool.query()와 pool.execute()을 사용해서).

    /* 풀 생성은 생략 */
    pool.query("SELECT field FROM atable", function(err, rows, fields){
      // 쿼리가 수행되면 connection은 자동으로 해제된다.
    })

    직접 풀로부터 connection을 얻고 나중에 되돌려주는 대체 방법도 있다.

    /* 풀 생성은 생략 */
    pool.getConnection(function(err, conn){
        // connection으로 무언가를 한다.
      conn.query(/* ... */);
      // 다 끝나면 connection 해제하기 잊지 말자!
      pool.releaseConnection(conn);
    })

    Promise Wrapper 사용하기

    MySQL2는 Promise API을 지원한다. Promise API는 ES7 async await와 매우 잘 동작한다.

    async function main(){
      const mysql = require('mysql2/promise');
      const connection = await mysql.createConnection({
        host: 'localhost', 
        user: 'root', 
        database: 'test' 
      });
      const [rows, fields] = await connection.execute('SELECT * FROM `table` WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
    }

    MySQL2는 스코프에서 사용 가능한 기본 Promise 객체를 사용한다. 사용자는 원하는 Promise implementation을 선택할 수 있다.

    const mysql = require('mysql2/promise');
    
    // promise implementation을 가져온다. 여기선 bluebird를 사용한다.
    const bluebird = require('bluebird');
    
    // connection을 생성하고,  bluebird를 Promise로 명시한다.
    const connection = await mysql.createConnection({
      host: 'localhost',
      user: 'root',
      database: 'test',
      Promise: bluebird
    });
    
    const [rows, fields] = await connection.execute('SELECT * FROM `table` WHERE `name` = ? AND `age` > ?', ['Morty', 14]);

    MySQL2는 .promise() 함수를 pool에 적용하여, 같은 pool에서 promise/non-promise connection을 생성할 수 있게 한다.

    async function main() {
      // get the client
      const mysql = require('mysql2');
      // create the pool
      const pool = mysql.createPool({host:'localhost', user: 'root', database: 'test'});
      // now get a Promise wrapped instance of that pool
      const promisePool = pool.promise();
      // query database using promises
      const [rows,fields] = await promisePool.query("SELECT 1");

    MySQL2는 .promise() 함수를 connection에 적용하여, 기존의 non-promise connection이 promise를 사용하도록 업그레이드한다.

    const mysql = require('mysql2');
    
    const con = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      database: 'test'
    });
    
    con.promise().query("SELECT 1")
        .then(([rows, fields]) => {
          console.log(rows);
        })
        .catch(console.log)
        .then(() => con.end());
Designed by Tistory.