[tpyeorm] Typeorm Transaction(트랜잭션)

김민재·2025년 4월 20일

typeorm

목록 보기
7/8

⌨ Transaction 사용

  1. import DataSource
import { DataSource } from 'typeorm';

  constructor(
    private readonly dataSource: DataSource,
  ) {}
  1. Start Transaction
    const qr = this.dataSource.createQueryRunner();
    await qr.connect();
    await qr.startTransaction(); // startTransaction() 격리 수준 설정 가능
  1. Transaction setting
try {
      const director = await qr.manager.findOne(Director, {
        where: { id: createMovieDto.directorId },
      });

      if (!director) {
        throw new NotFoundException('존재하지 않는 감독입니다.');
      }

      // genreIds 여러 개를 찾아온다.
      const genres = await qr.manager.find(Genre, {
        where: { id: In(createMovieDto.genreIds) },
      });

      if (genres.length !== createMovieDto.genreIds.length) {
        throw new NotFoundException(
          `존재하지 않는 장르가 있습니다. 존재하는 ids -> ${genres.map((genre) => genre.id)}`,
        );
      }

      const movieDetail = await qr.manager.save(MovieDetail, {
        detail: createMovieDto.detail,
      });

      const movie = await qr.manager.save(Movie, {
        title: createMovieDto.title,
        movieDetail: movieDetail,
        director: { id: createMovieDto.directorId },
        genres,
      });

      await qr.commitTransaction(); // 트랜잭션 Commit 데이터베이스에 반영

      return movie;
    } catch (error) {
      await qr.rollbackTransaction(); // 에러 사항 생기면 전체 복구

      throw error;
    } finally {
      await qr.release(); // 꼭 실행
    }
  • qr.manager.Repository method(Entity,{})
    manager를 통해 Entity에 설정할 수 있다.
  • await qr.commitTransaction(); 트랜잭션이 모두 끝나면 데이터베이스에 반영되낟.
  • await qr.rollabackTransaction(); 트랜잭션 실행 도중 에러가 발생하면 모두 되돌아간다.
profile
개발 경험치 쌓는 곳

0개의 댓글