Node.js에서 비동기(async)방식 mysql을 사용하는 이유를 예제와 함께 살펴보자.
1. 동기식 mysql (mysql)
pool+connection을 이용한 트랜잭션 예제 (sync)
var mysql = require('mysql');
var pool = mysql.createPool(...);
pool.getConnection(function(err, connection) {
if (err) throw err; // not connected!
connection.beginTransaction(function(err) {
if (err) throw err;
connection.query('INSERT INTO posts SET title=?', title, function (error, results, fields) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
var log = 'Post ' + results.insertId + ' added';
connection.query('INSERT INTO log SET data=?', log, function (error, results, fields) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});
connection.release();
});
커넥션, 트랜잭션, 쿼리 등의 모든 로직에 대해서 콜백함수를 통해 에러 처리를 해줘야하기 때문에 코드가 길고 이해하기 어렵다. 또한, 내부적으로 SQL문이 실행될 때 코드를 작성한 순서와 다르게 처리될 수도 있다.
2. 비동기식 mysql (mysql2/promise)
pool+connection을 이용한 트랜잭션 예제 (async)
const mysql = require('mysql2/promise');
const pool = mysql.createPool(...);
const connection = await pool.getConnection(async conn => conn);
try {
await connection.beginTransaction();
await connection.query(...);
await connection.commit();
console.log('success!');
} catch (err) {
await connection.rollback();
throw err;
} finally {
connection.release();
}
하지만, 이렇게 비동기식으로 작성하면 catch문 안에서 에러를 처리하기 때문에 모든 로직에 대해 불필요한 콜백 함수가 없다. 특히 트랜잭션 로직이 깔끔하다. 이 뿐만 아니라, 커넥션의 쿼리문 결과가 반환 될때까지 기다리기 때문에 SQL문이 순차적으로 처리되는 것을 보장한다는 장점이 있다.
3. 결론
- 코드가 간결하고 명확하다(콜백지옥 X).
- 트랜잭션 처리가 깔끔하다.
- 에러 처리가 간단하다.
- SQL문이 순차적으로 처리되는 것을 보장한다.
Reference
'웹 > Node.js' 카테고리의 다른 글
[Node.js] M1에서 nvm 설치하기 (2) | 2021.08.03 |
---|---|
[Node.js] MySQL에서 escaping을 사용하는 2가지 방법 비교 (0) | 2021.05.08 |
[Node.js] 모듈화에 사용되는 module.exports와 exports의 차이 (0) | 2021.04.13 |
[Node.js] JWT: Access Token & Refresh Token 인증 구현 (16) | 2021.04.06 |
[Node.js] MongoDB: 개념 및 기본 쿼리문 (0) | 2021.03.14 |