Node.js

[NestJS] TypeORM을 통한 트랜잭션 관리

임채성 2023. 4. 30. 19:02

서론

NestJS에서 관계가 묶여있는 여러 테이블에 INSERT를 해야하는 경우가 있습니다.

이 글에서는 TypeORM을 통해 트랜잭션을 관리해보겠습니다.

 

트랜잭션 관련 글

https://puleugo.tistory.com/142

 

데이터베이스 트랜잭션이란?

트랜잭션(Transaction) 트랜잭션: 데이터베이스 관리 시스템에서의 최소 상호작용의 단위 개요 데이터베이스 트랜잭션은 데이터베이스에서 수행되는 일련의 작업이며 모두 단일한 논리적 작업 단

puleugo.tistory.com

https://puleugo.tistory.com/143

 

트랜잭션 격리 수준

데이터베이스 트랜잭션 격리 수준 데이터베이스 트랜잭션의 격리 수준은 격리성(각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야한다는 규칙)의 견고함 정도를 말합니다. 트랜잭션 격

puleugo.tistory.com

 

코드를 보여줘.

UserService에서 oauth 로그인을 진행하는 코드입니다.

export class UserService {
	constructor(
        @InjectRepository(User)
        private readonly userRepository: Repository<User>,
        @InjectRepository(UserAuth)
        private readonly userAuthRepository: Repository<UserAuth>,
        @InjectRepository(UserAuthProvider)
        private readonly userAuthProviderRepository: Repository<UserAuthProvider>,
        private readonly dataSource: DataSource,
      ) {}

    async joinUserByOauth(data: {
        providerUsername: string;
        providerName: string;
    }): Promise<User> {
    const userAuthProvider = await this.userAuthProviderRepository.findOne({
        where: {
            name: data.providerName,
        },
    });
    
   
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect();
    
    // 트랜잭션 시작
    await queryRunner.startTransaction();

    try {
        const user = await this.userRepository.save({});

        const userAuth = new UserAuth();
        userAuth.provider = userAuthProvider;
        userAuth.providerId = userAuthProvider.id;
        userAuth.username = data.providerUsername;
        userAuth.user = user;
        userAuth.userId = user.id;

        await this.userAuthRepository.save(userAuth);
        // 커밋
        await queryRunner.commitTransaction();
        return user;
    } catch (e) {
    	// 롤백
        await queryRunner.rollbackTransaction();
    } finally {
    // 적용
    await queryRunner.release()
	}
}