Node.js에서 SQL 사용하기
본 게시글의 내용은 KWeb 준회원 스터디 강의 자료를 참조하였다.
mysql2
설치
Node.js
에서 sql을 사용하기 위해 npm
을 통해 mysql2
를 설치한다.
npm install mysql2
mysql2
사용하기
database.js
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: <db-host>,
port: <db-port>,
user: <db-username>,
password: <db-password>,
database: <db-name>,
});
const runQuery = async (pstmt, data) => {
const conn = await pool.getConnection();
try {
const sql = conn.format(pstmt, data);
const [result] = await conn.query(sql);
return result;
} finally {
conn.release();
}
};
module.exports = { runQuery };
mysql2
를 사용하기 위해 mysql2/promise
를 import한다.
createPool
메소드로 pool
을 생성한다. 여기서 데이터베이스에 대한 정보를 입력한다.
runQuery
함수는 실행할 pstmt
(prepared statement) 및 매개 변수의 배열인 data
를 인자로 받는다. pool
에서 생성한 connection
을 가져와 pstmt
에 data
의 값들이 삽입되어 만들어진 최종 sql 구문을 비동기적으로 실행한다. 더 이상 sql 구문의 실행이 필요하지 않을 때 connection
을 release하여 데이터베이스와의 연결을 종료한다.
const { runQuery } = require('./database');
const getScoreStats = async () => {
const sql = 'SELECT course, Count(*) AS cnt, Avg(final) AS avg, ' +
'Stddev(final) AS stddev FROM scores GROUP BY course';
const results = await runQuery(sql);
return results;
};
위의 예제는 sql
구문을 수행할 .js
파일에서 runQuery
함수를 import한 후, sql
구문을 비동기적으로 실행하는 함수를 정의한 것이다.
SELECT
구문을 사용하여 조회 결과, 데이터는 항상 row들의 dictionary 형태로 반환된다. 이때 key는 column 명, 값은 column의 값이다.
특정 변수의 값을 인자로 받아 sql 구문을 실행하는 함수는 다음 예제와 같이 작성할 수 있다.
const getScoreByIdName = async (id, name) => {
const sql = 'SELECT * FROM scores WHERE id = ? AND student = ?';
const results = await runQuery(sql, [id, name]);
return results[0];
};
이때 ?
키워드는 SQL에서 지원하는 parameter placeholder이다. 이를 사용하면 직접 Javascript에서 지원하는 ${변수명}
로 명시할 때 발생할 수 있는 SQL Injection을 방지할 수 있다. 예를 들어 sql의 키워드로 오인될 수 있는 '
또는 "
가 매개 변수의 일부로써 들어오는 경우 DBMS가 자동으로 escape를 수행한다.