inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

typeorm을 더 좋아하는 이유

트랜잭션 로직을 공통처리 하는 방법으로 적절할까요?

해결된 질문

320

김영욱

작성한 질문수 21

0

## 트랜잭션 서비스
@Injectable()
export class TransactionService {
  constructor(private readonly dataSource: DataSource) {}

  async transaction(callback) {
    const queryRunner = this.dataSource.createQueryRunner();
    await queryRunner.connect();
    await queryRunner.startTransaction();
    try {
      await callback(queryRunner);
      await queryRunner.commitTransaction();
      return true;
    } catch (error) {
      console.error(error);
      await queryRunner.rollbackTransaction();
      throw error;
    } finally {
      await queryRunner.release();
    }
  }
}
## 트랜잭션 모듈 (글로벌)
@Global()
@Module({
  providers: [TransactionService],
  exports: [TransactionService],
})
export class TransactionModule {}
## 사용예제
async join(email: string, nickname: string, password: string) {
  const user = await this.usersRepository.findOne({ where: { email } });
  if (user) {
    throw new HttpException('이미 존재하는 사용자입니다.', 401);
  }
  const hashedPassword = await bcrypt.hash(password, 12);

  await this.transactionService.transaction(async (queryRunner) => {
    const result = await queryRunner.manager.getRepository(Users).save({ email, nickname, password: hashedPassword });
    const sleact = await queryRunner.manager.getRepository(Workspaces).findOne({ where: { name: 'Sleact' } });
    await queryRunner.manager.getRepository(WorkspaceMembers).save({ UserId: result.id, WorkspaceId: sleact.id });
    const channel = await queryRunner.manager
      .getRepository(Channels)
      .findOne({ where: { name: '일반', WorkspaceId: sleact.id } });
    await queryRunner.manager.getRepository(ChannelMembers).save({ UserId: result.id, ChannelId: channel.id });
  });
}

 

안녕하세요 제로초님.

트랜잭션 관련해서 로직 작성하다가 실행부를 제외하고는 너무 공통되는 것 같아서 방법을 고민하다가 위 소스처럼 처리하면 어떨까 싶어 작성해보았습니다.
트랜잭션 서비스를 생성해서 공통이되는 트랜잭션 로직을 모아두고, 콜백함수를 받아서 처리하는 형태로 해보았는데요!

일단 동작은 정상적으로 하는데, 이렇게 했을 때 발생할만한 문제가 있을지 짐작이 가지 않아서 문의 남깁니다!

위와같은 로직으로 트랜잭션을 공통처리 했을 때 생길만한 사이드이펙트가 있을까요?

node.js express nestjs typeorm

답변 1

1

제로초(조현영)

일단 코드 상 문제는 없어 보입니다. 다만 실제 서비스에서는 트랜잭션을 여러 개 여는 경우도 있고, 하나의 트랜잭션 안에서 다른 트랜잭션을 여는 경우도 있어 이런 것들은 대응이 어려울 것 같네요.

https://www.npmjs.com/package/typeorm-transactional

이 라이브러리 적용이 제일 깔끔합니다.

강의자료는 어디서 다운받나요?

0

114

4

질문 있습니다.

0

299

3

(강의 5:42 질문) providers를 통한 여러 개의 인스턴스 생성 & exports 통한 싱글톤 생성

0

154

2

코드 편집기 확장 프로그램

0

209

2

(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?

0

146

2

(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문

0

169

3

로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.

0

152

2

로그인방법이 고민됩니다.

0

190

2

yarn seed 명령어 실행 시 데이터 삽입 안됨

0

297

4

yarn run db:create 시에 발생하는 데코레이터 오류

0

242

2

npm run db:create 시에 발생하는 decorating 오류

0

232

2

RxJS 디버깅 질문 있습니다.

0

189

3

CacheManager에 대해 질문 있습니다.

0

175

2

로깅은 어떻게 하는게 효율적일까요?

0

224

1

CORS 질문 있습니다.

0

418

2

쿠키 옵션에 대해서 질문 있습니다.

0

184

2

로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??

0

449

1

401 unauthorized문제

0

289

1

가드의 장점에 대해서 질문이 있습니다.

0

225

1

로그 관리에 대해 질문 있습니다.

0

252

2

CORS 에러 질문 있습니다.

0

319

2

배포 환경 DB 연결 질문 있습니다.

0

411

2

socket io 미 연결 문제 (nest & flutter)

1

1156

3

no elements in sequence 에러 관해서 질문이 있습니다.

0

454

1