[javascript] Express.js에서의 트랜잭션 처리 방법

Express.js는 Node.js 기반의 웹 애플리케이션 프레임워크로 많은 개발자들에게 사랑받고 있습니다. 이 프레임워크를 사용하여 데이터베이스에 트랜잭션을 처리하는 방법에 대해 알아보겠습니다.

1. 데이터베이스 설정

트랜잭션을 처리하기 위해서는 먼저 데이터베이스를 설정해야 합니다. 가장 일반적으로 사용되는 데이터베이스는 MySQL, PostgreSQL, MongoDB 등이 있습니다. 각 데이터베이스마다 다른 설정 방법이 필요하지만, 보통 mongoosesequelize라는 라이브러리를 사용하여 데이터베이스 연결을 설정합니다.

// 데이터베이스 연결 설정 예시 (Mongoose)
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 모델 정의
const Schema = mongoose.Schema;
const MyModelSchema = new Schema({ name: String, age: Number });
const MyModel = mongoose.model('MyModel', MyModelSchema);

2. 트랜잭션 처리

트랜잭션을 처리하기 위해서는 데이터베이스의 일관성을 유지하고 오류가 발생할 경우 롤백을 할 수 있어야 합니다. Express.js에서는 여러 가지 방법을 통해 트랜잭션을 처리할 수 있습니다.

2.1. Callback을 사용한 트랜잭션 처리

app.post('/transaction', (req, res) => {
  const session = mongoose.startSession();
  session.startTransaction();

  MyModel.create({ name: 'John', age: 30 }, (error, doc) => {
    if (error) {
      session.abortTransaction();
      session.endSession();
      return res.status(500).json({ error: '트랜잭션 실패' });
    }

    // 이후 추가적인 작업 수행

    session.commitTransaction();
    session.endSession();
    return res.status(200).json({ message: '트랜잭션 성공' });
  });
});

2.2. Promise를 사용한 트랜잭션 처리

app.post('/transaction', async (req, res) => {
  const session = mongoose.startSession();
  session.startTransaction();

  try {
    const doc = await MyModel.create({ name: 'John', age: 30 });

    // 이후 추가적인 작업 수행

    session.commitTransaction();
    session.endSession();
    return res.status(200).json({ message: '트랜잭션 성공' });
  } catch (error) {
    session.abortTransaction();
    session.endSession();
    return res.status(500).json({ error: '트랜잭션 실패' });
  }
});

3. 롤백 처리

트랜잭션 처리 중에 에러가 발생하면 데이터베이스를 롤백하여 이전 상태로 되돌릴 수 있어야 합니다. 이를 위해 try-catch 문을 사용하여 롤백 처리를 할 수 있습니다.

app.post('/transaction', async (req, res) => {
  const session = mongoose.startSession();
  session.startTransaction();

  try {
    // ...

    session.commitTransaction();
    session.endSession();
    return res.status(200).json({ message: '트랜잭션 성공' });
  } catch (error) {
    session.abortTransaction();
    session.endSession();
    return res.status(500).json({ error: '트랜잭션 실패' });
  }
});

4. 결론

Express.js에서 트랜잭션을 처리하는 방법에 대해 알아보았습니다. 데이터베이스 설정 후 콜백이나 프로미스를 사용하여 트랜잭션을 처리하고, 에러 발생 시 롤백하여 데이터베이스 일관성을 유지할 수 있습니다. 이를 통해 안정적이고 신뢰성 있는 웹 애플리케이션을 개발할 수 있습니다.