트랜잭션을 처리하는 데 있어 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
의 장점
- 코드 간소화:
@Transactional()
데코레이터만으로 트랜잭션 처리 가능. - 가독성 향상: 불필요한 코드가 줄어들어 로직이 더욱 명확해짐.
- 에러 처리 용이: 수동으로 커밋, 롤백 등을 관리할 필요가 없어 에러 가능성 감소.
사용 시 주의사항
- 중첩된 트랜잭션의 경우, 중복 커밋이나 롤백이 일어나지 않도록 주의해야 합니다.
- 트랜잭션이 필요한 비즈니스 로직에만 데코레이터를 사용하도록 합니다.
결론
typeorm-transactional
은 트랜잭션 처리를 간소화하여 코드의 유지 보수성을 높이고, 개발자의 실수를 줄여주는 유용한 도구입니다. 트랜잭션 관리가 복잡하고 반복적인 코드로 인해 어려움을 겪고 있다면, 이 라이브러리를 도입해 비즈니스 로직에 집중할 수 있는 환경을 만들어 보세요.
관련 링크
처음에 회사에서 사용하고 신세계 였습니다! 이 라이브러리를 통해서 얼마나 쉽게 트랜잭션을 사용할 수 있는지 직접 경험해 보시길 바랍니다! 😊
'개발 > NestJS' 카테고리의 다른 글
😎 NestJS class-transform 제대로 알고 쓰자! (3) | 2024.11.12 |
---|---|
[NestJS] TypeORM Pagination: 설치, 사용법, 직접 구현과의 비교 with nestjs-paginate (1) | 2024.11.05 |
[NestJS] 의존성 주입의 모든 것: Provider와 useClass, useFactory, useValue 사용법 (1) | 2024.10.23 |
[NestJS] CORS default의 함정 (0) | 2024.03.10 |
[NestJS] swagger 보안(잠금) (0) | 2023.04.24 |
댓글