Post

(TIL) 2025-01-24

(TIL) 2025-01-24

mysql2/Promise 트랜잭션(Transaction)


1. createConnection

단일 연결을 생성하며, 애플리케이션에서 데이터베이스와 연결을 하나만 사용하는 경우에 적합하다. 연결을 사용한 후에는 명시적으로 connection.end()로 연결을 종료해야 한다.
연결을 재사용하지 않으며, 매번 새로운 연결을 만들어야 하기 때문에 애플리케이션의 요청이 많거나 동시에 여러 요청이 들어오는 경우 비효율적일 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const mysql = require('mysql2/promise');

async function runTransaction() {
  // MySQL 연결 설정
  const connection = await mysql.createConnection({ host: 'localhost', user: 'root', database: 'test' });

  try {
    // 트랜잭션 시작
    await connection.beginTransaction();

    // 쿼리 실행
    await connection.query('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30]);
    await connection.query('INSERT INTO orders (user_id, amount) VALUES (?, ?)', [1, 100]);

    // 트랜잭션 커밋
    await connection.commit();
    console.log('Transaction committed successfully!');
  } catch (error) {
    // 오류가 발생하면 롤백
    await connection.rollback();
    console.error('Transaction rolled back due to error: ', error.message);
  } finally {
    // 연결 종료
    await connection.end();
  }
}

runTransaction();

2. createPool

연결 풀(connection pool)을 생성하며, 여러 개의 연결을 미리 만들어 놓고, 애플리케이션에서 필요할 때마다 연결을 가져다 쓰고 반환하는 방식.
여러 클라이언트 요청을 동시에 처리할 때 효율적입니다. 연결을 재사용할 수 있기 때문에 연결을 새로 만드는 오버헤드를 줄일 수 있다.
풀에 연결이 남아 있으면 자동으로 재사용되므로, 매번 새로 연결을 생성하는 것보다 성능이 개선된다.
풀을 사용한 후에는 연결을 명시적으로 connection.release()로 반환해야 하며, pool.end()를 호출하면 풀을 종료할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const mysql = require('mysql2/promise');

// 연결 풀 생성
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'test',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function runTransaction() {
  // 풀에서 연결을 가져옴
  const connection = await pool.getConnection();
  try {
    // 트랜잭션 시작
    await connection.beginTransaction();

    // 쿼리 실행
    await connection.query('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30]);
    await connection.query('INSERT INTO orders (user_id, amount) VALUES (?, ?)', [1, 100]);

    // 트랜잭션 커밋
    await connection.commit();
    console.log('Transaction committed successfully!');
  } catch (error) {
    // 오류가 발생하면 롤백
    await connection.rollback();
    console.error('Transaction rolled back due to error: ', error.message);
  } finally {
    // 연결 반환
    connection.release();
  }
}

runTransaction();

차이점 요약:

항목createConnectioncreatePool
연결 방식단일 연결을 생성하고 사용 후 종료 연결풀을 생성하여 여러 연결을 재사용
효율성요청이 많거나 동시 처리가 필요한 경우 비효율적여러 요청을 효율적으로 처리 가능
연결 종료connection.end()로 명시적으로 종료connection.release()로 연결 반환
주로 사용되는 경우단일 요청 처리 또는 낮은 트래픽 환경높은 트래픽, 동시 요청이 많은 애플리케이션

createConnection 은 단일 요청이나 낮은 트래픽 환경에서만 하나의 연결로 충분할 때 사용. createPool 은 여러 동시 요청을 처리하거나, 고성능이 요구되는 애플리케이션에서는 createPool을 사용하여 연결을 재사용하는 방식이 훨씬 효율적.

This post is licensed under CC BY 4.0 by the author.