Node.js
[NestJS] TypeORM을 통한 트랜잭션 관리
임채성
2023. 4. 30. 19:02
서론
NestJS에서 관계가 묶여있는 여러 테이블에 INSERT를 해야하는 경우가 있습니다.
이 글에서는 TypeORM을 통해 트랜잭션을 관리해보겠습니다.
트랜잭션 관련 글
https://puleugo.tistory.com/142
https://puleugo.tistory.com/143
코드를 보여줘.
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()
}
}