반응형
여러 테이블의 데이터를 한꺼번에 처리할 경우가 있습니다.
예를 들면 회원 탈퇴의 경우,
고객의 계정 정보와 다른 여러 테이블에 들어있는 정보들을 한꺼번에 삭제해줘야만 하죠.
이때 특정 데이터가 삭제되지 않고 남게 되면 문제가 발생할 수 있습니다.
이렇게 모든 데이터를 한꺼번에 지우고, 만약 하나라도 오류가 발생할 경우 모든 것을 원복하는 것을 트랜젝션이라 합니다.
Nestjs에서 typeorm을 사용할때 트랜젝션 처리 하는 샘플코드를 만들어봅니다.
총 3개의 테이블에 데이터가 들어 있습니다.
- user : 사용자
- user_authority : 사용자 권한
- survey : 설문 정보
각각의 테이블 정보를 삭제하는 코드는 다음과 같습니다.
- user(사용자) 삭제
async deleteUser(user: User): Promise<any>{
return await this.userRepository.createQueryBuilder()
.delete()
.from(User, 'user')
.where('id = :id', { id: user.id })
.execute();
}
- user_authority(사용자 권한) 삭제
async deleteUserAuthorities(user: User): Promise<any>{
return await this.userAuthorityRepository.createQueryBuilder()
.delete()
.from(UserAuthority, 'userAuthority')
.where('userId = :userId', { userId: user.id })
.execute();
}
- survey(설문 정보) 삭제
async deleteAllUserSurvey(user: User): Promise<any>{
return await this.surveyRepository.createQueryBuilder()
.delete()
.from(Survey, 'survey')
.where('userId = :userId', { userId: user.id})
.execute();
}
마지막에는 commit을 해줍니다.
await queryRunner.commitTransaction()
이 3가지를 transaction으로 처리하는 코드는 다음과 같습니다.
import {DataSource, FindOneOptions, Repository} from 'typeorm';
...
// 회원 탈퇴
async cancelUser(user: User): Promise<any>{
// transaction 처리
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try{
// survey 삭제
await this.deleteAllUserSurvey(user);
// 사용자 삭제
await this.deleteUser(user);
// 사용자 권한 삭제
await this.deleteUserAuthorities(user);
// commit
await queryRunner.commitTransaction()
} catch (err) {
// 실패시 rollback
await queryRunner.rollbackTransaction();
} finally {
// release
await queryRunner.release();
}
}
이렇게 작성하시면 3개가 모두 성공해야만 회원 탈퇴가 성공하게 되고, 하나라도 실패할 경우 Rollback이 됩니다.
이상으로 Nestjs에서 typeorm의 tranaction 처리에 대해 알아보았습니다.
반응형
'Nestjs 활용팁' 카테고리의 다른 글
nestjs e2e test시 오류 - Jest did not exit ... (0) | 2024.10.14 |
---|---|
Nestjs 413 Payload too large 오류 해결 방법 (0) | 2023.09.12 |