본문 바로가기
개발/NestJS

TypeORM 트랜잭션: typeorm-transactional 사용 전후 비교

by coking 2024. 10. 29.

트랜잭션을 처리하는 데 있어 TypeORM은 다양한 기능을 제공하지만, 코드의 복잡성 때문에 트랜잭션 처리를 쉽게 하기 위해 typeorm-transactional 같은 라이브러리를 사용하는 것이 점점 인기를 끌고 있습니다. 이 글에서는 typeorm-transactional 라이브러리를 사용했을 때와 사용하지 않았을 때의 코드를 비교하여 장단점을 설명하고, 해당 라이브러리를 사용하면 얼마나 쉽게 트랜잭션 처리를 할 수 있는지를 보여드리겠습니다.

TypeORM 트랜잭션 기본 사용법

기본적으로 TypeORM에서 트랜잭션을 사용하는 방법은 쿼리 러너(QueryRunner)를 사용하는 것입니다. 이 방식은 익숙하지만, 코드가 길고 복잡해지는 단점이 있습니다. 아래는 TypeORM에서 트랜잭션을 사용하는 기본적인 예시입니다:

import { getConnection } from 'typeorm';
import { User } from './entity/User';

async function createUserWithTransaction(userData: any) {
  const connection = getConnection();
  const queryRunner = connection.createQueryRunner();

  await queryRunner.connect();
  await queryRunner.startTransaction();

  try {
    const user = new User();
    user.name = userData.name;
    user.email = userData.email;

    await queryRunner.manager.save(user);

    await queryRunner.commitTransaction();
    return user;
  } catch (error) {
    await queryRunner.rollbackTransaction();
    throw error;
  } finally {
    await queryRunner.release();
  }
}
  • 쿼리 러너를 생성하고 트랜잭션을 시작하며, 성공 시 커밋, 실패 시 롤백을 해야 합니다.
  • 이러한 코드 구조는 트랜잭션을 사용할 때마다 반복적으로 작성해야 하며, 코드의 유지 보수성을 떨어뜨립니다.

typeorm-transactional 라이브러리를 사용한 트랜잭션

typeorm-transactional 라이브러리는 트랜잭션 처리 코드를 더 간결하고 쉽게 관리할 수 있게 도와줍니다. 이 라이브러리를 사용하면 트랜잭션에 관련된 코드를 크게 줄일 수 있습니다.

설치

먼저, typeorm-transactional을 설치합니다:

npm install typeorm-transactional

사용 예시

이 라이브러리를 사용하면 트랜잭션 처리 코드가 훨씬 간단해집니다. 아래는 동일한 로직을 typeorm-transactional을 사용하여 작성한 코드입니다:

import { Transactional } from 'typeorm-transactional';
import { User } from './entity/User';
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  @Transactional()
  async createUser(userData: any): Promise<User> {
    const user = new User();
    user.name = userData.name;
    user.email = userData.email;

    return await this.userRepository.save(user);
  }
}
  • @Transactional() 데코레이터만 사용하면 트랜잭션이 자동으로 관리됩니다. 복잡하게 작성할 필요가 없어집니다!!
  • 코드가 훨씬 간결해지고 가독성이 높아집니다.
  • 복잡한 쿼리 러너 설정과 관리를 하지 않아도 됩니다.

typeorm-transactional 사용 전후 비교

사용 전

  • 트랜잭션을 처리하기 위해 쿼리 러너를 수동으로 관리해야 합니다.
  • 트랜잭션 시작, 커밋, 롤백 등의 반복적인 코드가 필요합니다.
  • 실수로 queryRunner.release()를 빼먹거나 롤백하지 않으면 문제가 발생할 수 있습니다.

사용 후 (typeorm-transactional)

  • 단순히 메서드에 @Transactional() 데코레이터를 추가하여 트랜잭션을 처리합니다.
  • 코드의 중복을 줄일 수 있고, 가독성이 크게 향상됩니다.
  • 트랜잭션 관리 로직을 신경 쓰지 않아도 되므로 비즈니스 로직에 집중할 수 있습니다.

typeorm-transactional의 장점

  1. 코드 간소화: @Transactional() 데코레이터만으로 트랜잭션 처리 가능.
  2. 가독성 향상: 불필요한 코드가 줄어들어 로직이 더욱 명확해짐.
  3. 에러 처리 용이: 수동으로 커밋, 롤백 등을 관리할 필요가 없어 에러 가능성 감소.

사용 시 주의사항

  • 중첩된 트랜잭션의 경우, 중복 커밋이나 롤백이 일어나지 않도록 주의해야 합니다.
  • 트랜잭션이 필요한 비즈니스 로직에만 데코레이터를 사용하도록 합니다.

결론

typeorm-transactional은 트랜잭션 처리를 간소화하여 코드의 유지 보수성을 높이고, 개발자의 실수를 줄여주는 유용한 도구입니다. 트랜잭션 관리가 복잡하고 반복적인 코드로 인해 어려움을 겪고 있다면, 이 라이브러리를 도입해 비즈니스 로직에 집중할 수 있는 환경을 만들어 보세요.

관련 링크

처음에 회사에서 사용하고 신세계 였습니다! 이 라이브러리를 통해서 얼마나 쉽게 트랜잭션을 사용할 수 있는지 직접 경험해 보시길 바랍니다! 😊

댓글