여는 글 — 사라진 잔고의 밤
이런 경험, 상상해 본 적 있으세요? ATM에서 10만 원을 뽑는데 지폐가 나오다 말고 기계가 멈춥니다. 화면은 꺼졌고, 돈은 안 나왔어요. 그런데 다음 날 통장을 보니 10만 원이 빠져나가 있습니다.
돈이 기계에도, 지갑에도 없습니다. 그 순간 10만 원은 말 그대로 증발한 거예요.
개발자라면 여기서 바로 감이 올 겁니다. 이체는 사실 쿼리 두 방이거든요.
한쪽 잔고 -10만, 다른 쪽 +10만. 문제는 그 사이입니다. 서버가 죽으면?
네트워크가 끊기면? 두 요청이 같은 계좌를 동시에 때리면?
이 위험한 틈을 막아주는 장치가 바로 트랜잭션(transaction) 입니다.
규칙은 딱 하나예요. “다 되거나, 하나도 안 되거나.” 출금만 되고 입금은 실패하는 어중간한 상태는 세상에 존재하면 안 됩니다. 이 한 줄짜리 약속을 지키려고, 지난 50년간 수많은 개발자가 삽질을 반복했어요. 장부와 싸우고, 락을 걸었다 풀고, 장애에 대비해 로그부터 먼저 썼죠.
이 책은 그 삽질의 역사입니다.
우리는 트랜잭션이 없던 시절부터 시작합니다. 손으로 장부 두 개를 맞춰 쓰던 시대, 정전 한 번에 파일이 반쯤 깨지던 초기 DB, 그리고 “transaction”이라는 단어가 처음 태어난 1970년대 IBM 연구소까지. 거기서 ACID라는 네 가지 약속을 만나고, 수천 명이 마지막 재고 하나를 동시에 노리는 동시성 전쟁터를 지나, 데드락과 커넥션 풀 고갈 같은 현업의 지옥까지 내려갑니다.
다 읽고 나면, 무심코 치던 @Transactional 한 줄이 다르게 보일 거예요. 그 뒤에서
무엇이 당신의 데이터를 지키고 있는지, 그리고 그게 왜 그렇게 생겼는지 알게 될
테니까요.
자, 트랜잭션이란 단어조차 없던 시대로 가봅시다.