본문 바로가기

Language \ Framework/Node.js

[Nodejs] - Mysql 연동

0.

프로젝트 진행 중 Mysql DB를 사용할 일이 생겨서 Nodejs와 연동을 해야했다.

기존에 MS Sql만 연동되어 있어, Mysql과 연동할 라이브러리가 필요했다.

 

1.

먼저 npm을 통해 mysql을 설치해준다.

 

npm install mysql

 

이후 datasource를 작성하여 연결한다.

 

const mysql = require('mysql');

let pool;

// mysql connect
pool = mysql.createConnection({
    host: 'DB HOST',
    user: 'user id',
    password: 'password',
    database: 'DB name'
});

pool.connect();

pool.query('SELECT 1', function (error, results, fields) {
	console.log(result);
});

pool.end();

 

사용법은 이러하다.

 

2.

생각보다 간단하게 연동할 수 있었으나, 이슈가 있었다.

 

1. 사용하지 않을때에 connection을 해제해주지 않으면 계속해서 연결되어 있다는 것.

 

2. 호출 방법에 따라 다를 수 있는 부분이지만,

router 영역에서 사용 시 비동기적인 흐름때문에 router안에서 DB를 호출하여 데이터 반환까지의 과정보다 router 자체의 프로세스가 먼저 끝날 수 있다는 것.

 

1번의 경우보다는 2번의 이슈를 먼저 해결하기 위해 promise 사용이 필요했다.

그에 맞춰서 생각하던 중에 mysql2의 존재를 알게됐다.

 

mysql2를 사용하면 1번의 경우도 해결이 가능하고, 자체적으로 promise 기능이 있어서 동기 프로세스가 가능했다.

 

3.

mysql2도 mysql과 연결방법은 비슷하다.

 

npm install mysql2

 

mysql2를 설치 한후,

 

const mysql = require('mysql2');

let pool;
let result;
pool = mysql.createPool({
	host: 'DB HOST',
    user: 'user id',
    password: 'password',
    database: 'DB name'
});

pool.promise().query('SELECT 1')
        .then(([rows, fields]) => {
            console.log(rows)
            result = rows;
        })

 

 

이런 식으로 사용이 가능하다.

 

하지만 이렇게 하더라도 router의 프로세스가 먼저 끝나버리는 경우가 있어서,

 

async function executeQuery(q){
    var result;
    logger.info(q);
    await pool.promise().query(q)
        .then(([rows, fields]) => {
            
            result = rows;
        })

    return result;
}

 

async와 await를 사용해주었다.

 

js는 항상 비동기적 흐름때문에 좋기도 하고 어렵기도 한것 같다... ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ