[Tistory] TypeOrm) typeorm-transactional 라이브러리로 transaction 관리하기

원글 페이지 : 바로가기

TransactionNotStartedError typeORM에서 typeorm-transactional 라이브러리로 transaction 관리하기 문제사항 : transaction 처리 안되는 오류 발생. rollback 이 되어야하는 상황에서 ‘TransactionNotStartedError’가 발생하고 서버가 먹통됨. 그러나 transaction은 확실하게 start 되었고, rollback 될 때만 연결이 유실됨. 즉 정확한 이유는 모르겠지만, interceptor로 transaction 관리가 시작된후, error가 발생하면 어딘가에서 QueryRunner인스턴스가 종료되어 독릭적인 연결을 사용하지 못하게 되는것으로 보임 TransactionNotStartedError 오류 해석 : “Rollback 하려고하는데, Transaction이 시작된적이 없어“ 즉, rollback하려는 datasorce가 사라져서 관리 안되는 문제임 기존 transaction 관리 소스코드 : CRUD 일 경우에만 @UseInterceptor() 데코레이터 사용하여 transactionInterceptor를 실행시키고 본 Interceptor에서 transaction을 관리함. Interceptor 동작시 transaction start. 오류 발생시 catch 하여 rollback 하고 release. 성공시 commit 하고 release. 오류 발생 예상원인 : exception filter interceptor의 rollback catch 보다 exception filter 가 먼저 작동 되고, 그사이에 interceptor datasorce를 잃은 것이 아닐까 추측함 원인 아님!! : exception filter 보다 interceptor 가 먼저 실행됨. 아래는 nestjs의 생명 주기임 6,7번 참고 Request Handling: NestJS가 HTTP 요청을 처리합니다. Interceptors: Interceptors가 요청을 가로채고, 요청 처리 전/후에 특정 로직을 실행합니다. Controller: 요청이 컨트롤러로 전달됩니다. Service Method Execution: 컨트롤러가 서비스 메서드를 호출합니다. Exception Occurrence: 서비스 메서드나 그 내부 로직에서 예외가 발생합니다. Interceptors (Catch): Interceptor에서 예외를 잡는 로직이 있다면, 여기서 먼저 처리합니다. Exception Filters: Interceptor에서 예외를 잡지 못하면 ExceptionFilter로 예외가 전달되어 처리됩니다. interceptor 는 controller계층에서부터 사용되기 때문에 service계층에서 error가 발생하면 service 계층에서 dataSource가 끊기고, transaction이 종료되어 rollback 하지 못하는게 아닐까 추측 해결방안 : typeorm-transactional 라이브러리를 사용하여 Transaction을 서비스계층에서 관리함과 동시에 코드중복문제와 동시성 이슈를 해결하고자함. npm i typeorm-transactional 라이브러리 설치 main.ts // 제일 첫줄 ! 추가 initializeTransactionalContext(); initializeTransactionalContext()는 트랜잭션 데코레이터가 올바르게 작동할 수 있도록 트랜잭션 컨텍스트를 초기화함 애플리케이션 시작 시 한 번만 호출되어야 하며, 이후 Transactional 데코레이터를 사용하는 모든 메서드에서 트랜잭션을 관리할 수 있게함 typeorm 설정 TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) =>
        await typeORMConfig(configService),
//이부분 추가 !
      dataSourceFactory: async (options) => {
        if (!options) {
          throw new Error(‘Invalid options passed’);
        }
        return addTransactionalDataSource(new DataSource(options));
      },
    }), addTransactionalDataSource 함수는 typeorm-transactional 라이브러리를 사용하여 TypeORM의 DataSource에 트랜잭션 기능을 추가하는 역할을 함. 이 함수는 DataSource를 래핑(wrapping)하여 트랜잭션을 지원할 수 있도록 설정해줌 기본적으로 TypeORM의 DataSource는 트랜잭션을 지원하지만, addTransactionalDataSource는 이를 보다 쉽게 관리하고 사용할 수 있도록 도와줌 addTransactionalDataSource는 트랜잭션 컨텍스트를 설정하여, 트랜잭션이 시작되고 커밋되거나 롤백될 때 이를 자동으로 관리함. 이를 통해 트랜잭션 경계를 더 명확하게 설정하고 관리할 수 있음 특히 트랜잭션이 올바르게 시작되고 종료되는지 보장해주는데. 트랜잭션이 올바르게 관리되지 않으면 데이터 일관성 문제가 발생할 수 있는데 addTransactionalDataSource는 이러한 문제를 예방해줌 service 계층 메서드에 @Transactional() 데코레이터 추가 import { Transactional } from ‘typeorm-transactional’;

@Injectable()
async TransactionTestService(){

construct(){}

@Transactional()
async getTrainingList(userIdDto: UserIdDto) {
try{
//service 로직, repository 로직
}catch(error){
throw error;
}
}
} 참고 https://blog.naver.com/gi_balja/223422569009 Nest.js – 트랜잭션 (Transaction) 트랜잭션 (Transaction) 소개 트랜잭션은 여러 데이터베이스 작업들을 하나의 단위로 묶어 처리하는 것을 … blog.naver.com https://cdragon.tistory.com/entry/NestJS-NestJS-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0With-TypeORM [NestJS] NestJS 트랜잭션(Transaction) 관리하기(With TypeORM) 1. 트랜잭션 with NestJS & TypeORM 데이터베이스 트랜잭션(Database Transaction)은 DBMS(Database Management System)내에서 수행되는 작업의 단위를 형상화하고, 다른 트랜잭션들과 독립되어 일관적이고 안전한 방 cdragon.tistory.com https://seizetheday95.tistory.com/17?category=1174339 [nestjs] transaction 라이브러리 분석하기 – 1 이 시리즈는 typeorm-transactional 라이브러리를 분석하게 된 계기와 분석한 내용이 담겨있습니다. 이전 글에서는 typeorm에서 트랜잭션을 관리하는 방법을 간단히 설명하였습니다. 그리고 typeorm에서 seizetheday95.tistory.com https://velog.io/@wndbsgkr/NestJS%EC%97%90%EC%84%9C-Transaction-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0feat.-TypeORM NestJS에서 트랜잭션을 위해 typeorm-transactional을 알아보자 NestJS에서 Transaction의 로직을 어떻게 깔끔하게 적용시킬 수 있을지 생각했다. 적용할 수 있는 방법이 코드에 직접 QueryRunner를 사용하거나 앞선 방식을 개선한 트랜잭션 인터셉터를 사용하는 것이 velog.io https://velog.io/@wlduq0150/Nest.js-TypeORM%EC%9D%84-%ED%86%B5%ED%95%B4Transaction%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%98%EC%9E%90 [Nest.js] TypeORM을 통해Transaction을 적용하자 이번 프로젝트에서는 공연의 예매를 하는 기능을 구현하게 되었다.구현에 필요하는 것은 다음과 같다.1\. 만약 사용자의 소지금, 좌석 문제등으로 에러가 발생할때 전체 동작을 취소하는 것2\. velog.io https://velog.io/@wlduq0150/Nest.js-%EC%86%8C%EC%BC%93%ED%86%B5%EC%8B%A0-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC Nest.js – 트랜잭션 (Transaction) 트랜잭션 (Transaction) 소개 트랜잭션은 여러 데이터베이스 작업들을 하나의 단위로 묶어 처리하는 것을 … blog.naver.com

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다