[Nestjs] #5. async/await 으로 커넥션 풀 트랜잭션

exoluse·2021년 12월 3일
2

Nestjs

목록 보기
5/7
post-thumbnail

mysql2 설치

npm install mysql2

근데 왜 mysql 이 아닌 mysql2?

그건 바로 Promise wrapper 가 있기 때문이다. 자세한건 링크를 참조 바란다.

npm - mysql2 공식문서 : Promise Wrapper
https://github.com/sidorares/node-mysql2/blob/master/documentation/Promise-Wrapper.md

트랜잭션은 어떻게?

1. 커넥션 풀에서 커넥션 가져오기

const connection = await _dbConn.getConnection(async conn => conn);

2. 트랜잭션 시작

try {
    await connection.beginTransaction();
}

3. 트랜잭션이 필요한 쿼리 날리기

const [rows] = await connection.query(`INSERT INTO EMP (id, name) VALUES (2, "exol")`);

4. 커밋

await connection.commit();

5. 에러 발생시에는 롤백, 커넥션 해제

try {
    ...
} catch(err) {
    await connection.rollback();
    connection.release();
} finally {
    connection.release();
}

DB 설정 소스

const mysql = require('mysql2/promise');

let _dbConn = mysql.createPool({
    host: 'localhost',
    user: 'user',
    password: 'pass',
    database: 'dbname'
});

export { _dbConn } 

서비스 소스

import { Injectable } from '@nestjs/common';
import { _dbConn } from 'src/const/db';


@Injectable()
export class UserService {

    async insertUser(userData){

        const connection = await _dbConn.getConnection(async conn => conn);

        try {
            await connection.beginTransaction();
            const [rows] = await connection.query(`INSERT INTO EMP (id, name) VALUES (2, "exol")`);
            await connection.commit();
			return rows;
        } catch(err) {
			await connection.rollback();
			connection.release();
			console.log('Query Error');
			return false;
        } finally {
            connection.release();
        }


    }
    
}

정상 케이스 테스트

비정상 케이스 테스트

bad sql grammar nested exception 을 임의로 일으킨다

const [rows] = await connection.query(`INSERT INTO EMP (id, name) VALUES (${userData.id}, '${userData.name}')`);
const [rows1] = await connection.query(`INSERT INTO EMP (id, name) VALUES (${userData.id}, '${userData.name}'zzz)`);

데이터가 들어오지 않는다. 트랜잭션 정상 작동 확인.

끗!

0개의 댓글