작성
·
153
답변 1
0
트랜잭션 테스트가 어려운 이유는 여러 개의 작업이 하나의 트랜잭션으로 돌아가는 경우와 여러 개의 트랜잭션으로 쪼개져서 돌아가는 것이 중간에 실패하지 않는 한 결과가 똑같기 때문입니다.
보통 데이터 등록이 있는 경우 테스트를 수행하고 DB를 조회해서 원하는 결과가 나왔는지 테스트를 하죠.
그런데 트랜잭션의 핵심은 데이터 등록과 수정 등의 조작하는 작업이 하나의 "단일" 작업으로 실행되는 것입니다. 이게 하나의 작업으로 묶였는지 따로 따로 돌아갔는지는 결과만 봐서는 알 수 없는 거죠.
이체를 한다면 하나의 은행 계좌에서 돈을 꺼내서 다른 계좌에 돈을 넣는 거죠. 이건 꼭 하나의 작업으로 묶여야만 합니다. 돈을 못 꺼내면 당연히 다른 계좌에 입금하면 안되는 거고, 돈을 인출하는 건 성공했지만 다른 계좌에 입금이 실패하면 인출한 것도 취소해야 하죠.
문제는 이런 "이체" 기능을 하나의 트랜잭션으로 잘 개발했는지를 테스트 하는 건 쉽지 않다는 거죠. 이체를 실행하고 한쪽에선 돈이 나가고 다른 쪽에는 돈이 들어가면 이체 기능이 성공한 것은 맞지만, 이게 하나의 트랜잭션에서 진행된 것인지는 확실하지가 않죠. 각각 다른 트랜잭션으로 되어서, 나중에 운이 나빠서 입금쪽이 실패했는데 출금 계좌로 돈이 다시 들어가는(DB 롤백)게 안 될 수도 있으니까요.
그래서 트랜잭션이 바르게 되었는지 테스트 하려면 트랜잭션이 시작되는 것고 어떤 작업이 포함되는지를 로우레벨에서 일일히 모니터링하고 그걸 기준으로 체크하든지, 아니면 중간에 실패했을 때 앞의 작업이 롤백됐는지를 확인해봐야 합니다. 이걸 강제로 세팅하는 게 만만하지가 않아서, 제가 경험한 바로 대부분 트랜잭션 테스트를 엄격하게 하지 않습니다. 그냥 성공한 경우만 테스트 하는데, 그게 트랜잭션이 잘 된 상태로 성공했는지는 보장이 안 된다는 것이죠.
나름 자세히 설명드리려고 했는데 이해하는데 도움이 되셨으면 좋겠습니다.