Transaction:
데이터가 꼬여서 데이터 오염이 발생하는 것을 방지하기 위해 사용
Transaction은 처리되는 작업의 단위를 말합니다.
데이터베이스에서 서로 다른 Transaction들을 처리하는 과정 중에서 하나의 Transaction에서 에러가 생겼다면, 실패 하기 전에 실행 성공한 Transaction 까지 전부 실패 처리(rollback)합니다.
Transaction이 모두 성공했을 경우에는 확정(commit)을 해줍니다.
TypeOrm의 Transaction을 처리하기 위한 다양한 전략이 존재합니다. 간단하게 @Transactional
데코레이터를 사용하여 해당 Method 위에서 간편하게 처리할 수도 있고, Callback Style로 처리할 수도 있습니다.
NestJS에서 강력하게 추천하는 방식은 바로 QueryRunner
를 통해 Transaction을 수행하는 것입니다.
QueryRunner를 사용하면 Transaction의 Commit과 Rollback을 수동으로 제어할 수 있습니다.
또한, Unit Testing(단위 테스트)를 보다 쉽게 진행할 수 있습니다. 즉 Jest를 통한 Testing 시 Mocking을 좀 더 쉽게 할 수 있습니다.
- 원자성 (Atomicity)
- 일관성 (Consistency)
- 독립성 (Isolation)
- 지속성 (Durability)
원자성 : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 점을 의미합니다.
일관성 : 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 점을 의미합니다.
독립성 : 둘 이상의 트랜잭션이 실행 되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 의미합니다.
지속성 : 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점을 의미합니다.
Transaction의 결과는
Commit
과Rollback
으로 이루어져 있습니다.
Commit : 하나의 트랜잭션이 성공적으로 끝났으며, DB가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 성공적으로 끝났다 라는 것을 의미 합니다.
Rollback : 트랜잭션의 로직 진행 과정 중에 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우를 의미합니다.
Rollback이 되면 트랜잭션을 처음부터 다시 시도하거나, 부분적으로만 연산된 결과를 다시 취소 시킵니다.