인프런 커뮤니티 질문&답변

바나나머스탱님의 프로필 이미지
바나나머스탱

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

typeorm transaction

try문 밖에서 에러 발생시 트랜잭션이 release가 안됩니다.

해결된 질문

작성

·

195

1

12:00 시작된 join 매서드를 만들고 실행을 시켜보니 에러 처리를 하면 커넥션 pool이 종료되지 않는거 같습니다.

 

이메일이 중복된 user를 insert하려 할 때 new ForbiddenException이 실행이 됩니다. 하지만 finally문이 실행이 안되는거 같습니다.

async join(email: string, nickname: string, password: string) {
  const queryRunner = this.dataSource.createQueryRunner();
  await queryRunner.connect();
  await queryRunner.startTransaction();
  const user = await queryRunner.manager
    .getRepository(Users)
    .findOne({ where: { email } });
  if (user) {
    throw new ForbiddenException('이미 존재하는 사용자입니다');
  }
  const hashedPassword = await bcrypt.hash(password, 12);
  try {
    const returned = await queryRunner.manager.getRepository(Users).save({
      email,
      nickname,
      password: hashedPassword,
    });
    const workspaceMember = queryRunner.manager
      .getRepository(WorkspaceMembers)
      .create();
    workspaceMember.User = returned.id;
    workspaceMember.Workspace = 1;
    // throw new NotFoundException('롤백해봐');
    await queryRunner.manager
      .getRepository(WorkspaceMembers)
      .save(workspaceMember);
    await queryRunner.manager.getRepository(ChannelMembers).save({
      User: returned.id,
      ChannelId: 1,
    });
    await queryRunner.commitTransaction();

    return true;
  } catch (error) {
    console.error(error);
    await queryRunner.rollbackTransaction();
    throw error;
  } finally {
    console.log('이거 실행됨?');
    await queryRunner.release();
  }
}

'이거 실행됨?' 이라는 문자가 출력이 되지 않습니다.

 

여러번 반복한 후 pgAdmin에서 database activity를 살펴보니

커넥션 pool이 release되지 않고 idle 상태로 되어있습니다.

이 때문에 서버의 pool이 가득차서 서버가 종료됩니다.

 

user의 중복검사도 try문 안에 넣으면 해결되는거 같습니다. 🟩 혹시 존재하는 사용자 로직을 try문 밖에 빼신 이유가 있는지 궁금합니다.

 

 

 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아, 넣는 게 맞습니다.

바나나머스탱님의 프로필 이미지
바나나머스탱

작성한 질문수

질문하기