/ WEB, BACKEND, DB, PROGRAMMING, JS

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을 가져와 pstmtdata의 값들이 삽입되어 만들어진 최종 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를 수행한다.