휴먼에러를 방지하는 방법 1 - git add -p(git add partial (or patch)
우리가 커밋을 하고 코드를 push/merge 할 때에는 잘 동작하고 테스트도 잘 통과되었기 때문에 그랬을 것이다.
만일 내가 서비스를 잘 알고, 개발도 잘 하고, 테스트 커버리지도 100%에 가깝다 하더라도 항상 주의하고 침착해야 한다.
만일 코드 한줄로 회사가 문을 닫을수도 있는게 바로 개발이다.
git add -p는 변경된 파일의 일부만 선택적으로 스테이지에 추가할 수 있도록 도와주는 기능이다.
전체 파일을 한 번에 커밋하지 않고, 필요한 부분만 선택해서 커밋하고 싶을 때 사용하며 매번 사용하는 습관을 들이면 좋다.
습관을 들인다면 10년후 누군가 내 코드의 의도를 쉽게 파악하는데 도움이 된다.
누가 여기에 매우 잘 작성해 놨다.
https://gist.github.com/mattlewissf/9958704
Lightning Talk: Git add -p
Lightning Talk: Git add -p . GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
코드 한줄이 회사 문을 닫게할 뻔한 예시를 ChatGPT 한테 물어봤다.
다양한 소수점/정밀도 문제로 인한 출금/재정 손실 분야별 사례들
🪙 1. 암호화폐 거래소/지갑 관련 사례
✅ [Upbit (2020)] – ‘소수점 잔고 보유로 출금 이상’
- 문제: 특정 토큰 출금 시 잔고가 0.00000001처럼 남아 있어도, 잔고 전체를 출금 요청할 수 있었음.
- 영향: 다수 유저가 잔고 이상 출금 시도. 시스템에서 탐지하여 자동 차단되었지만, 일시적 오작동 발생.
✅ [Binance Smart Chain - Venus Protocol (2021)] – Liquidation 오류
- 문제: 정밀도 오류로 인해 담보 계산 시 소수점 반올림 문제 발생.
- 결과: 일부 유저는 담보 부족 상태인데도 청산되지 않고, 반대로 충분한 유저가 청산됨.
- 손실 규모: 1,000만 달러 이상.
✅ [Balancer v1 (2020)] – Arbitrage 공격
- 문제: 가격 계산 시 정밀도 손실 때문에 거래소 간 가격 차이 발생.
- 결과: 봇들이 이를 이용해 반복 arbitrage 실행 → 플랫폼은 유동성 풀 손실 발생.
- 조치: v2에서는 정밀도 개선 및 price oracle 강화.
💰 2. 핀테크/결제 플랫폼 사례
✅ [PayPal 소수점 환불 오류 (과거 보고된 사례)]
- 문제: 환불 시 0.01 단위 오차가 누적돼 잔고와 불일치.
- 결과: 사용자는 0.01달러씩 이익, PayPal은 그 수만큼 누적 손실. 보통 감지되기 전까지 누적됨.
✅ [일본 결제앱 Merpay (2020)] – 캐시백 정산 오류
- 문제: 이벤트 캐시백 금액 소수점 처리 오류.
- 결과: 일부 유저가 1엔 이상 더 받는 현상, 반복 요청 시 무제한 적립 가능 버그 악용됨.
- 조치: 즉시 중단 및 회수 조치.
🎮 3. 게임 플랫폼 사례
✅ [블리자드 Battle.net 포인트 환전 버그 (2000년대 초반)]
- 문제: 포인트를 현금으로 전환 시, 반복 전환 중 소수점 이득 누적.
- 결과: 유저가 소액 이득 반복 획득 → 계정 정지 및 포인트 롤백.
✅ [모바일 RPG 게임 (중국)] – 무한 루프 거래 버그
- 문제: 인게임 재화를 1.999 → 2.0으로 변환되는 환율 시스템 악용.
- 결과: 수천 개 계정이 이 방식으로 재화 증식 후 현금화 시도. 대규모 롤백 및 게임사 손실.
🏦 4. 은행/증권 관련 사례
✅ [HSBC 외환 거래 오류 (2015)]
- 문제: 고객 외환 스프레드 계산에 정밀도 오류 포함.
- 결과: 수백만 달러 이익을 고객에게 덜 지급 → 법적 문제 야기.
✅ [Tinkoff Bank (러시아)] – 이자 계산 정밀도 이슈
- 문제: 이자 계산 시 0.01루블 미만 정밀도 손실 → 일부 유저는 손해, 일부 유저는 과이자 수령.
🤖 왜 이런 문제가 자주 생길까?
요인 설명float, double 사용 | 정밀도가 떨어짐. 특히 금융/토큰에서는 금기. |
언어 간 정밀도 차이 | JS vs Python vs Solidity 등 처리 방식 다름. |
프론트 vs 백엔드 불일치 | 프론트는 반올림, 백엔드는 내림 등의 방식 불일치. |
복합 계산 누적 | 이자, 거래 수수료, 환율 등 복합 계산에서 미세 오차가 누적됨. |
✅ 마무리 정리
“소수점 오류 → 출금 이상 → 손실” 이라는 흐름은 실제로 다양한 분야에서 반복적으로 발생했어.
소수점 단위라도 규모가 커지면 엄청난 금전 손실로 이어질 수 있기 때문에, 대부분의 금융/플랫폼 서비스는 다음을 기본으로 함:
- decimal 또는 BigDecimal 사용
- 모든 수치는 최소 단위 기준 정수로 저장 (예: 1 ETH = 10^18 wei)
- 출금/정산은 반드시 이중 검증
- 단위 테스트에서 극단적인 소수점 값 테스트 필수
ChatGPT 에 언급된 서비스를 개발하는 엔지니어들은 검증받은 사람들일것이다.
이 사람들은 이런걸 개발하면서 어떤 문제가 발생할 수 있을지 예상하며 개발했을 것이다. (몰랐다면 저 기업에 못 다니지 않았을까?..)
저렇게 대단한 서비스에서 이러한 사고가 발생한건 정말 "휴먼 에러" 때문일 것이다.
그래서 우리는 항상 겸손한 태도를 가지며 침착함을 유지하고 커밋을 잘 해야한다..
테스트 시나리오를 제대로 작성하지 못한것은 비즈니스의 니즈를 명확하게 이해하지 못했다고 볼 수 있을 것이다.
만일 예외처리를 잘 하지 못했다면 설계에서 빠진 부분이 있었기 때문일 것이다.
이것을 잘 하려면 코드를 먼저 작성하지 말고 그림과 글로 잘 정리를 해야한다.
라고 아는 형이 어릴때 말해줬는데 진짜 많이 도움되었다.