-
Node MySQL2Node.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());
'Node.js > 백엔드' 카테고리의 다른 글
AWS EC2로 Node.js 애플리케이션 배포하기(+ pm2) (0) 2020.03.05 (ppt슬라이드) Express로 서버 구축하기, Sequelize란? (0) 2020.01.31 What app.set function do (Express.js) (0) 2020.01.30 REST API, JSON, 라우터 리팩토링 (0) 2020.01.04 노드 개념, 기능, 자바스트립트 (0) 2020.01.04