[NestJS] typeorm의 transaction공부방2023. 11. 9. 09:50
Table of Contents
728x90
728x90
서론
JWT를 구현하는 도중, 아래와 같은 에러가 발생했다.
//회원가입 및 JWT TOKEN 발급 코드
async signup(signInDto: UserSigninDto) {
const user = await this.userService.findById(signInDto.id);
const exist = user != null;
if (exist) {
throw new BadRequestException('중복된 아이디 존재');
}
else {
const valiUser = new UserEntity();
const hashedPassword = this.hash(signInDto.pw);
valiUser.id = signInDto.id;
valiUser.pw = hashedPassword;
const savedUser = await this.userService.saveUser(valiUser);
return this.removePasswordFromUserData(savedUser);
}
}
회원가입과 동시에 JWT Token을 발급하는 그런 로직을 짜고 있었는데, DB에는 들어왔지만, 에러는 발생한 그런 상황이다. 토큰은 발급되지 않았다.
@Transactional
자바를, 스프링을 사용했을 당시 AOP를 활용한 선언적 트랜잭션인 @Transactional 애너테이션을 사용하곤 했었다.
//게시판의 게시글을 삭제하는 메서드
@Transactional
public void removeBoard(Long id)throws Exception{
replyDAO.removeAll(id); //삭제할 게시글의 답글 삭제
boardDAO.deleteBoard(id); //게시글 삭제
}
typeorm에서는?
데커레이터는 권장하지 않는다고 하여 getManager().transaction()과 queryRunner중 queryRunner을 사용했다.
async signup(signInDto: UserSigninDto) {
//typeorm transaction start
const queryRunner = this.datasource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const user = await this.userService.findById(signInDto.id);
const exist = user != null;
if (exist) {
throw new BadRequestException('중복된 아이디 존재');
}
else {
const hashedPassword = this.hash(signInDto.pw);
const valiUser = new UserEntity();
valiUser.id = signInDto.id;
valiUser.pw = hashedPassword;
const savedUser = await this.userService.saveUser(valiUser);
const delPwUserData = this.removePasswordFromUserData(savedUser);
const token = this.createToken(delPwUserData)
await queryRunner.commitTransaction();
return token;
}
} catch (error) {
await queryRunner.rollbackTransaction();
console.error(error);
} finally {
await queryRunner.release();
}
}
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!