본문 바로가기

개발공부

[ 인생퍼즐 ] TypeORM Transaction 사용

Transaction 사용 이유

프로젝트 중 일부 로직에서 DB에 정보 저장은 관련 파일이 서버에 정상적으로 전송되었을 때 이루어져야 했다. 하지만 서버에 저장되어야 하는 파일 경로에 DB 정보 저장할 때 생기는 고유키가 필요했다. DB 정보 임시 저장 후 고유키로 완성된 파일 경로로 전송해야 했다. 전송이 성공했을 때 DB 정보를 저장 완료를 해야 했다. 그래서 성공 시 DB Commit, 실패 시 DB Rollback 할 수 있는 Transaction을 사용했다. 

Transaction 구현

1. EntityManager 사용 방식

 

async saveUser(){
  await connection.getRepository(User).manager.transaction(async (manager) => {
    await manager.save(user);
    await saveFile(file);
  })
}

 



2. 데코레이터 사용 방식

 

@Transaction()
async saveUser(@TransactionManager() manager: Entity){
  await manager.save(user);
  await saveFile(file);
}

 

 

3. QueryRunner 사용 방식

 

async saveUser() {
  const queryRunner = dataSource.createQueryRunner();
  
  await queryRunner.startTransaction();

  try {
    await queryRunner.manager.save(user);
    await saveFile(file);

    await queryRunner.commitTransaction()
  } catch (err) {
    await queryRunner.rollbackTransaction()
  } finally {
    await queryRunner.release()
  }
}

프로젝트에 사용한 Transaction

프로젝트는 repository를 기반으로 DB Connection을 구성하고 있다. Repository에서 QueryRunner 속성은 비어있고 데코레이터 방식은 일관성이 없기 때문에 EntityManager을 사용한 Transaction 구현했다.