해결된 질문
작성
·
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문 밖에 빼신 이유가 있는지 궁금합니다.