트랜잭션(transaction)

전은평·2023년 4월 30일
0

데이터 오염 ?
의도적 또는 우연적인 행위 때문에 기억 장치나 디스크에 저장된 데이터의 의미가 바뀌거나 사라져 데이터의 무결성이 침해를 받는 현상.

데이터 오염을 방지하기 위해선 transaction을 사용하면 된다.

transaction에 대해 알아보자!!


결제시 발생할 수 있는 데이터 오염

보통 자주 사용되는 곳은 결제 등 돈이 오고 가는 프로세스에서 많이 이용된다. 결제를 완료했고 결제가 완료되어서 frontend에서 결제된 데이터를 요청받게 되면 당연히 백엔드는 이 데이터를 DB에 저장해야 한다. 하지만 이때 결제정보를 저장할 뿐만 아니라 동시에 사용자가 결제한 금액을 누적 결제금액을 컬럼에 최신화 시켜주어야 한다.

그런데 결제정보는 저장했는데 중간에 에러가 생겨 로직이 끝났다면 결제정보만 저장되고 사용자의 구매 누적금액은 최신화가 되지 않는 상황이 발생하게 된다.. 그렇게 되면 데이터가 꼬여서 데이터 오염이 발생하게 된다. 이처럼 한 프로세스에 여러가지 일을 처리해야하는 경우 데이터 오염이 발생할 가능성이 높습니다.

그럴때 ACID 트랜잭션을 사용해 데이터 오염 문제를 해결할 수 있다.

따라서, NestJS에서 Transaction을 사용해 보자.


Transaction

Transaction은 처리되는 작업의 단위로,

데이터베이스에서의 Transaction 처리는 Business Logic 상 굉장히 중요한 기능이다.

따라서, 서로 다른 트랜잭션들을 처리하는 도중 하나의 단위 트랜잭션에서 에러가 발생한다면 이전에 성공했던 트랜잭션들을 다시 rollback 시켜 데이터의 Consistency(일관성)가 깨지지 않도록 해준다.

모두 성공했을 경우에는 commit을 통해 확정 지어주게 된다.

DB의 Transaction Flow

1. 서로 다른 Transaction을 부분적으로 처리

2. 모든 Transaction이 정상적으로 완료되면 Commit 처리

3. 만약 Transaction중 하나라도 비정상적으로 처리되면 rollback!!!


Transaction Process


TypeOrm Transaction Strategies

TypeOrm의 Transaction을 처리하기 위한 다양한 전략이 존재하는데, 간단하게 @Transactional 데코레이터를 사용하여 해당 Method 위에서 간편하게 처리할 수도 있고, Callback Style로 처리할 수도 있.

NestJS에서 강력하게 추천하는 방식은 바로 QueryRunner를 통해 Transaction을 수행하는 것이다. 

QueryRunner를 사용하면 Transaction의 Commit과 Rollback을 수동으로 제어할 수 있고, Unit Testing(단위 테스트)를 보다 쉽게 진행할 수 있다.

즉 Jest를 통한 Testing 시 Mocking을 좀 더 쉽게 가능하다!!

참고자료
코드캠프 강의자료

profile
`아는 만큼 보인다` 라는 명언을 좋아합니다. 많이 배워서 많은 걸 볼 수 있는 개발자가 되고 싶습니다.

0개의 댓글