체인의정석

node.js) mysql2를 사용하여 db query, insert 하는 코드 본문

개발/backend

node.js) mysql2를 사용하여 db query, insert 하는 코드

체인의정석 2024. 11. 21. 12:04
728x90
반응형

node.js에서 mysql2를 사용하여 상호작용 하는 코드는 다음과 같다.

const mysql = require('mysql2');
const { logger } = require('./logger');
require("dotenv").config();

const MYSQL_HOST = process.env.MYSQL_HOST 
const MYSQL_PORT = process.env.MYSQL_PORT
const MYSQL_DATABASE = process.env.MYSQL_DATABASE 
const MYSQL_USER = process.env.MYSQL_USER
const MYSQL_PASSWORD = process.env.MYSQL_PASSWORD

// Promisify the connection.query method
function queryPromise(connection, sql, args) {
  return new Promise((resolve, reject) => {
    connection.query(sql, args, (err, results, fields) => {
      if (err) {
        return reject(err);
      }
      resolve({ results, fields });
    });
  });
}

// Function to create and return a new MySQL connection
async function createConnection() {
  // console.log(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE)

  const connection = mysql.createConnection({
    host: MYSQL_HOST,
    port: MYSQL_PORT,
    user: MYSQL_USER,
    password: MYSQL_PASSWORD,
    database: MYSQL_DATABASE
  });

  return new Promise((resolve, reject) => {
    connection.connect(err => {
      if (err) {
        logger.error('mysql.js connection : ', err);
        reject(err);
      } else {
        resolve(connection);
      }
    });
  });
}

async function closeConnection(connection) {
  try {
    connection.end();
  } catch (error) {
    logger.error('mysql.js closeConnection : ', error);
    console.error(error);
    throw error;
  }
}

async function isConnected(connection) {
  if (connection === undefined) {
    return new Promise((resolve, reject) => {
      resolve(false);
    });
  }

  return new Promise((resolve, reject) => {
    connection.query('SELECT 1', (err) => {
      if (err) {
        resolve(false);
      } else {
        resolve(true);
      }
    });
  });
}


module.exports = {
  queryPromise,
  createConnection,
  closeConnection,
  isConnected,
};



참고로 로깅 및 환경 변수 설정의 경우 아래 포스팅을 참고하면 된다.

https://it-timehacker.tistory.com/531

 

node.js) dotenv를 이용한 환경변수 분리 및 winston을 이용한 logger 만들기

코드를 서버에 올리게 되면서 logger에 대한 경로나 환경변수 분리 등을 정리해봤다.먼저 로그를 남기는 경우 winston과 winston-daily-rotate-file을 사용하였다. "winston": "^3.17.0", "winston-daily-rotate-file": "^5.

it-timehacker.tistory.com

먼저 DB를 사용할 때는 

 const connection = await createConnection();
 //쿼리를 사용해서 CRUD를 하는 부분, connection 을 넘겨주고 따로 쿼리들만 모아서 빼둔 파일에서 가져와서 사용
 await closeConnection(connection);

다음과 같이 하나의 개별 프로세스에서 DB와 상호작용하는 첫 부분에서는 createConnection을 해두고 상호작용이 모두 일어나고 나서는 closeConnection을 해준다. 만약 DB에 접근해서 해야하는 작업이 여러개라면 connection을 열고하고 작업이 다 끝났다면 다음 DB접근 로직까지는 closeConnection을 해주는것이 필요하다.

 const find_db_res = await find_by_key(connection, key);

위와 같이 쿼리를 따로 빼둔 함수에다가 connection과 쿼리에 필요한 키 값등을 넘기는 식으로 접근을 하면 된다.

const find_by_key = async(connection, key) => {
  const sql_search = `
  select res1, res2 from ${MYSQL_DATABASE}.t_transaction where key = '${key}';
  `
  const getReqTxId = await queryPromise(connection, sql_search);

  if(getReqTxId.results.length==0) {
    logger.error("[query.js] request id of fromTxHash not exist");
    throw Error("[query.js] request id of fromTxHash not exist");
  }
  const res1 = getReqTxId.results[0].res1;
  const res2 = getReqTxId.results[0].res2;
  return {res1, res2};
}

이런식으로 접근하면 된다.

저장하는 쿼리의 예시의 경우 아래와 같다.

const insert_db = async(
  connection, val1, val2, val3
) => {
  const query = `INSERT INTO ${MYSQL_DATABASE}.t_request_tx
    (
      val1, val2, val3, updated_at
    )
    VALUES
    (
      ?,?,?,NOW()
    )
  `
  const values = [
    val1, val2, val3
  ]

  try {
    const res_db = await queryPromise(connection,query,values);
    return res_db;
  } catch (error) {
    logger.error(`[query.js] error ${error} occued from query ${query}, values ${values}`)
    throw Error("[query.js] insert_request_tx_send error : ", error);
  }
}

위와 같이 INEST의 VALUE값 안에 직접 NOW()를 입력하면 현재 시간 기준으로 데이터베이스에 시간이 찍히게 되며, 마찬가지로

connection이 열렸을 때 await insert_db(connection, val1, val2, val3 ) 이런식으로 한줄을 더 추가해주면 된다.

 

728x90
반응형
Comments