참고사이트


Node.js MySQL

[Node.js] mysql을 async/await로 처리하기

async/await을 쓰기 위해선 mysql2를 사용해야함!!

Node.js에서 mysql을 async/await으로 작성하기


Data Type


mysql 명령어

mysql -u root -p 접속이후...

#connection 상태 확인하기
show full processlist;

#현재 connection 수 확인하기
show status like 'Threads_connected';

#현재 동작중인 connection 수 확인하기
show status like 'Thread_running';

client & connection pool

//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에 보관한다.

callback 방식의 테이블 생성

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);
  }
})

async/await 방식의 테이블 생성

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);
})

트랜젝션을 이용한 insert

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);
})

update

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);
})