Boundary Decision

트랜잭션 경계는 “같이 성공해야 하는 변경”만 안에 둔다

경계를 넓히면 정합성은 쉬워지지만 락 시간과 실패 영향도 같이 커진다. 각 업무를 원자성, 시간, 복구 가능성으로 나눠 본다.

원자성 질문

같이 성공하지 않으면 불변식이 깨지는가?

안쪽: 재고 차감 + 주문 저장

둘 중 하나만 커밋되면 업무 상태가 틀어진다.

바깥: 이메일/푸시 알림

실패해도 DB 결과는 보존 가능하다.

시간 질문

대기 시간이 DB 락으로 번지는가?

안쪽: 짧은 조회와 갱신

커넥션을 오래 잡지 않는 작업만 둔다.

바깥: HTTP, 파일, 결제 승인

외부 지연이 전체 트랜잭션을 붙잡는다.

복구 질문

실패 후 다시 시도하거나 보상할 수 있는가?

안쪽: 되돌릴 수 없는 변경

원자성이 더 중요하면 트랜잭션 안쪽에 둔다.

바깥: Outbox + 재시도

커밋된 이벤트를 별도 작업자가 처리한다.

핵심: DB 플러시가 외부 세계까지 되돌려 주지는 않는다. 외부 부작용은 별도 경계로 설계한다.