부동소수점 오차로 정산 불일치가 난 실패 경험과 해결 과정 중심
팀 프로젝트에서 수수료 정산 기능을 만들 때, 소수점 반올림 방식을 신경 쓰지 않았다가 하루 전체 정산 금액이 7원 차이나는 오류가 생겼습니다. 소액이었지만 금융 로직에서 오차가 누적되는 게 얼마나 심각한지 처음 체감했습니다.
원인은 Python의 `float` 타입을 그대로 쓴 것이었습니다. decimal.Decimal 로 교체하고 반올림 방식을 ROUND_HALF_UP으로 명시하니 오차가 사라졌습니다. 이 경험 이후 금액이 관여되는 모든 연산에서는 부동소수점을 쓰지 않는다는 원칙을 세웠습니다.
트랜잭션 범위도 함께 정리했습니다. 정산 계산과 DB 저장이 별개 연산으로 분리돼 있어 중간에 실패하면 일부만 저장되는 문제가 있었습니다. 명시적인 트랜잭션으로 묶고 원자성을 보장하니 재실행 시 일관성이 유지됐습니다. 정산 시스템에서는 속도보다 정확성과 원자성이 먼저라는 걸 그때 배웠습니다.