일반적으로 한 번에 처리되어야 할 명령 집합을 Transaction이라 하며, 이를 통해 DB의 회복과 병행 제어가 가능하다. 필자의 경우를 생성된 Product의 BarcodeUnit이 이전에 존재하지 않는다면, 새로운 Barcode를 생성해야 하는 기능이 필요하다. 이처럼 한 번에 여러 프로세스를 진행할 때 에러가 발생할 경우 이전에 생성된 Barcode 무도 rollback 해야 한다.
TypeOrm의 Transaction을 처리하기 위해 여러 가지 방법이 있는데 간단하게 @Transactional 데코 레이어를 사용하는 방법, Callback Style로 처리하는 방법, QueryRunner를 통해 Transaction을 수행하는 방법이 있다. Nest에서는 QueryRunner 방식을 추천하고 QueryRunner 방식은 UnitTest에서 Repository에 대한 Mocking을 할 때 좀 더 수월하게 진행할 수 있다. 따라서 필자는 QueryRunner 방식을 통해서 수동으로 transaction을 제어하였다.
TypeOrm Module을 통해서 connection을 import 하고 Connection 객체를 Product Service에 DI 시켜준다. createQueryRunner() 함수를 통해 Transaction Manager를 수행할 수 있다.
createQueryRunner 함수를 변수 queryRunner로 선언하고, startTransaction을 통해서 transaction을 시작시킨다. try~catch~final 문으로 로직을 감싸고 에러가 발생할 경우 catch에서 에러를 잡아내서 queryRunner rollback시켜준다. 모든 로직이 이상 없이 실행되었다면, commitTransactioin을 통해서 임시 저장을 시켜주고 commitTransaction이 끝나면 release 함수를 호출해서 종료시킨다.