Bami 2022. 7. 20. 18:44
728x90
반응형

Node에서 Mysql쿼리를 사용하다보면 다중 쿼리가 필요할 때가 많이 있습니다.

물론 SQL문 함수로 다중쿼리를 처리하는 방법도 있지만 오늘은 Node의 Mysql2을 사용하여 다중쿼리 처리하는 방법에 대해 알아보도록 하겠습니다.

 

Mysql2을 써보지 않은 분들은 'Mysql'은 아는데 'Mysql2'는 뭐야? 하실 겁니다.

MySQL과 MySQL2의 차이점은 promise에 있습니다.

mysql은 callback기반이기 때문에 promise를 사용하지 못하고 npm에 있는 promise-mysql 모듈을 따로 설치해서 사용해야하지만 mysql2는 promise를 지원하기 때문에 다른 모듈을 설치하지 않고 사용이 가능합니다.

 

그래서 promise는 pending,  fullfilled, rejected 라는 상태가 존재하게 되는데요.

  • pending - 비동기 처리 로직이 아직 완료되지 않은 상태를 말하는데 new Promise로 Promise가 생성된 직후 부터 resolve나 reject가 호출되기 전까지의 순간입니다.
  • fullfilled - 처리가 완료되어 프로미스가 결과값을 반환한 상태를 말하는데 비동기 처리함수 값이 참이라면 resolve메서드가 호출되고 resolve메서드의 인자로 설정한 비동기 함수의 결과값이 전달됩니다. 이 결과는 then을 통해 후속처리 되죠.
  • rejected: 처리가 실패하거나 오류가 발생한 상태를 말합니다.

자, 이제 어떻게 사용하는지 알아볼까요?

 

먼저 mysql2를 설치해봅시다.

npm install mysql2

그 후 mysql2를 사용하여 DB연결 부분을 만들어보겠습니다.

const mysql = require('mysql2/promise');
var config = require('./db_info').local;

var connection_info = {
    init: function () {
      if (process.env.NODE_ENV === "production") {
        config = require('./db_info').local;
      }
     
      return mysql.createPool({
        host: config.host,
        port: config.port,
        user: config.user,
        password: config.password,
        database: config.database,
        connectionLimit: 30
      });
    }
  };

저의 경우 config파일을 따로 만들어서 호출하는 형태로 하였습니다. 여기까진 Mysql을 사용하여 설정하는 것과 비슷합니다.

 

class db_services {
    constructor () {
        // dbconneciton 
        this.db_connector = require('../conf/db_conn');
        this.dbc = this.db_connector.init(); // db connection
    }
    // 게시글 상세 페이지 데이터 가져오기
    async get_board_detail (out, no) {
        let sel_sql = "SELECT * FROM board_detail WHERE boardID = "+no+"";
        let upd_sql = "UPDATE board SET BoardHits = BoardHits + 1 WHERE BoardNo = "+no+"";
        
        let conn =  await this.dbc.getConnection();
        let result = null;
        let error = null;
        try {
            await conn.beginTransaction(); // 트랜잭션 적용 시작
            let detail_board = await conn.query(sel_sql);
            await conn.query(upd_sql);
            await conn.commit(); // 커밋
            result = detail_board[0];
            out(error, result);
        }catch (err) {
            error = err;
            console.log(err)
            out(error, result);
            await conn.rollback() // 롤백
            // return res.status(500).json(err)
        } finally {
            conn.release() // con 회수
        }
    }
  }

제가 토이 프로젝트로 하고 있는 SQL문을 가져왔습니다.

await conn.beginTransaction();에서 DB트랜잭션을 시작하여 쿼리들을 실행시킵니다.

먼저 conn.query()를 사용하여 sel_sql의 쿼리를 실행 후, upd_sql의 쿼리를 실행시키는 형태입니다.

이 쿼리가 정상적으로 실행된다면 conn.commit();이 실행 될 것이고,  중간에 실패하게 된다면 

catch() 부분에서 잡히게 되는데 rollback()하여 쿼리 실행을 취소시켜버립니다.

 

이렇게 하면 중간에 에러났을 때 롤백처리 관련해서 머리 아플일이 없게 되죠.

 

이렇게 Mysql2가 무엇이고, 기존 Mysql과는 어떤 차이점이 있는지, 어떻게 사용하는지에 대해 알아보았습니다.

궁금한 사항이 있거나, 틀린 부분이 있다면 언제든지 알려주시면 감사하겠습니다!

 

 

728x90
반응형