[Node.js] mysql을 async/await로 처리하기
async/await을 쓰기 위해선 mysql2를 사용해야함!!
Node.js에서 mysql을 async/await으로 작성하기
mysql -u root -p 접속이후...
#connection 상태 확인하기
show full processlist;
#현재 connection 수 확인하기
show status like 'Threads_connected';
#현재 동작중인 connection 수 확인하기
show status like 'Thread_running';
//const mysql = require('mysql');
const mysql = require('mysql2/promise');
const {
MYSQL_HOST,
MYSQL_USER,
MYSQL_PW,
MYSQL_DB,
} = process.env;
module.exports = mysql.createPool({
host: MYSQL_HOST,
user: MYSQL_USER,
password: MYSQL_PW,
database: MYSQL_DB,
connectTimeout: 5000,
connectionLimit: 30 //default 10
})
/**
connectionLimit : 연결 개수 제한 수, 기본값은 10
*/
connection pool을 사용하는 이유? 사용자의 요청마다 connection을 계속해서 생성하다 보면 서버에 과부하가 생길 수 있다. 이를 방지하기 위해 일정 개수의 connection을 미리 만들어 pool에 담아두고 사용자의 요청이 들어오면 담아두고 있던 걸 연결시켜주고, 종료시 다시 반환 받아 pool에 보관한다.
router.post('/user_table', async (req, res) => {
console.info('/api/mysql/make/user_table');
let rt = {
ok: false,
msg: '',
result: null
}
try {
const sql = `CREATE TABLE tb_user (
user_id varchar(255),
user_nm varchar(255),
user_pw varchar(255),
user_addr varchar(255),
user_mk_dt datetime,
user_upd_dt datetime,
is_use tinyint(1)
)`;
mysql.getConnection((err, connection) => {
if (err) {
console.error('connection Error : ', err);
rt.msg = 'connection Error';
rt.result = err;
res.send(rt);
} else {
connection.query(sql, (err, rs, fields) => {
if (err) {
console.error('query Error : ', err);
rt.msg = 'query Error';
rt.result = err;
res.send(rt);
} else {
console.log('result : ', rs);
rt.ok = true;
rt.msg = 'success!!';
rt.result = rs;
res.send(rt);
}
})
connection.release();
}
});
} catch (err) {
console.error("makeTable/user_table Error!!");
console.error(err);
rt.msg = 'user_table Error';
rt.result = err.message;
res.send(rt);
}
})
router.post('/insert', async (req, res) => {
let rt = {
ok : false,
msg : '',
result : null
}
const params = req.body;
console.table(params);
let conn = null;
try {
if (params.user_id === undefined || params.user_id === '') throw '아이디 없음';
if (params.user_nm === undefined || params.user_nm === '') throw '이름 없음';
if (params.user_pw === undefined || params.user_pw === '') throw '패스워드 없음';
const sql = `INSERT INTO tb_user (user_id, user_nm, user_pw, user_addr, user_mk_dt, user_upd_dt, is_use) VALUES (
"${params.user_id}",
"${params.user_nm}",
"${encryptPassword(params.user_pw)}",
"${params.user_addr}",
NOW(),
NOW(),
1
)`;
conn = await mysql.getConnection();
const [ rows, fields ] = await conn.query(sql);
console.log(rows);
console.log(fields);
rt.ok = true;
rt.msg = 'ok';
rt.result = rows;
conn.release();
} catch (err) {
console.error('userTable/user_insert Error!!');
console.error(err);
rt.msg = 'user_insert Error';
rt.result = err.message;
conn.release();
}
res.send(rt);
})
router.post('/insert', async (req, res) => {
let rt = {
ok : false,
msg : '',
result : null
}
const params = req.body;
let conn = null;
try {
if (params.user_id === undefined || params.user_id === '') throw '아이디 없음';
if (params.user_nm === undefined || params.user_nm === '') throw '이름 없음';
if (params.user_pw === undefined || params.user_pw === '') throw '패스워드 없음';
const sql = `INSERT INTO ${table} (user_id, user_nm, user_pw, user_addr, user_mk_dt, user_upd_dt, is_use) VALUES (
"${params.user_id}",
"${params.user_nm}",
"${encryptPassword(params.user_pw)}",
"${params.user_addr}",
NOW(),
NOW(),
1
)`;
conn = await mysql.getConnection();
//트랜젝션 시작
await conn.beginTransaction();
const [ rows ] = await conn.query(sql);
rt.ok = true;
rt.msg = 'ok';
rt.result = rows;
await conn.commit(); //commit
conn.release();
} catch (err) {
console.error('userTable/user_insert Error!!');
console.error(err);
rt.msg = 'user_insert Error';
rt.result = err.message;
await conn.rollback(); //rollback
conn.release();
}
res.send(rt);
})
router.post('/update', async (req, res) => {
let rt = {
ok: false,
msg: '',
result: null
}
const params = req.body;
let conn = null;
try {
let sql = `UPDATE ${table} SET `;
//---------------
//배열을 toString() 처리하면 콤마 처리가 편리해서 이렇게 만들어 봤음
let tmp = [];
if (params.user_nm) {
tmp.push(`user_nm="${params.user_nm}"`);
}
if (params.user_pw) {
tmp.push(`user_pw="${params.user_pw}"`);
}
if (params.user_addr) {
tmp.push(`user_addr="${params.user_addr}"`);
}
//--------------
console.log(tmp.toString());
if (tmp.length == 0) {
throw { message : '입력된 값이 없음'};
} else {
sql += `${tmp.toString()} WHERE user_id="${params.user_id}"`;
console.log(sql);
conn = await mysql.getConnection();
await conn.beginTransaction();
const [ result ] = await conn.query(sql);
rt.ok = true;
rt.msg = 'ok';
rt.result = result;
await conn.commit();
conn.release();
}
} catch (err) {
console.error('userTable/user_updae Error!!');
console.error(err);
rt.msg = 'user_update Error';
rt.result = err.message;
if (conn !== null) {
await conn.rollback();
conn.release();
}
}
res.send(rt);
})