참조: https://wikidocs.net/158616
트랜잭션은 하나의 논리적 작업을 완료하기 위해 데이터베이스를 변화시키는 일련의 행동들을 하나의 단위로 바라보는 것이다.
예를 들어 '게시판에서 유저가 탈퇴한다' 라는 하나의 논리적 작업을 완료하기 위해,
먼저 유저를 조회하는 작업과 해당 유저가 작성한 글,
댓글을 모두 삭제하는 작업,
그리고 그 유저데이터를 삭제하는 작업 이 세 일련의 행동을
하나의 유저탈퇴 트랜잭션으로 구성할 수 있는 것이다.
참조 : https://dawitblog.tistory.com/187
데이터의 무결성을 위해 트랜잭션을 쓰는것 같음!
TypeORM에서 트랜잭션을 사용하는 방법은 3가지가 있는데
데코레이터를 사용하는 방법은 권장하지 않는대(왜?)
또한 ACID 특성역시 같이 공부해야함!!
참조 :
https://wikidocs.net/158616
private async saveUserUsingQueryRunner(
name: string,
email: string,
password: string,
signupVerifyToken: string,
) {
// 컨스트럭트로 주입받은 connection객체에서 Queryrunner 실행
const queryRunner = this.connection.createQueryRunner();
// DB에 연결 후
await queryRunner.connect();
// 트랜잭션 시작
await queryRunner.startTransaction();
try {
// 여기서 user 를 DB에 저장함
const user = new UserEntity();
user.id = uuid.v4();
user.name = name;
user.email = email;
user.password = password;
user.signupVerifyToken = signupVerifyToken;
await queryRunner.manager.save(user); // 원래 await this.usersRepository.save(user) 였음
// throw new InternalServerErrorException(); // 일부러 에러를 발생시켜 본다
// 트랜잭션 허락하여 데이터영속화
await queryRunner.commitTransaction();
} catch (e) {
await queryRunner.rollbackTransaction();
} finally {
// 직접 생성한 QueryRunner는 해제시켜 주어야 함
await queryRunner.release();
}
}
queryRunner라는 typeORM 객체가 중간에 관여해
매니저가 세이브를 하고 트랜잭션을 성공적으로 마무리하게 함 신기!
이제 어떻게 실패를 하게 되면 다시 롤백 가능!