Featured image of post 데이터베이스에 금액 저장하기: DECIMAL과 BIGINT 중 무엇을 사용할까?

데이터베이스에 금액 저장하기: DECIMAL과 BIGINT 중 무엇을 사용할까?

결제 시스템을 개발할 때 금액은 어떤 필드 타입으로 저장해야 할까요? 이 글에서는 FLOAT를 절대 사용해서는 안 되는 이유와, 오차가 없고 성능이 뛰어난 통화 저장 시스템을 위해 DECIMAL과 BIGINT 중 어떻게 선택할지 자세히 알아봅니다.

결제 또는 이커머스 시스템을 개발하거나 데이터베이스 금액 필드를 설계할 때, “금액은 FLOATDOUBLE로 저장하면 되겠지"라고 생각한 적이 있으신가요?

만약 그렇다면, 지금 당장 멈추세요! 시스템이 남몰래 돈을 흘리고 있을지도 모릅니다.

금융 시스템에서 부동 소수점 사용이 금지된 이유는 무엇일까요? 사소해 보이는 정밀도 오차라도 엄청난 거래량과 시간이 누적되면 돌이킬 수 없는 재앙을 초래할 수 있습니다.

그렇다면 돈을 저장하는 데 정확히 무엇을 사용해야 할까요?

왜 FLOAT는 재무 시스템에 독이 되는가?

컴퓨터의 세계에서 숫자는 이진수로 표현됩니다. FLOAT(부동 소수점 숫자)는 특정 십진 소수를 표현할 때 실제로는 “근사치"가 됩니다. 이것은 정교한 케이크를 거친 전기톱으로 자르려는 것과 같아서, 아무리 조심해도 가장자리에서 항상 부스러기가 떨어지는 것과 같습니다.

가장 고전적인 예가 있습니다: 0.1 + 0.2는 컴퓨터에서 종종 0.3이 되지 않습니다. 수백만 건의 거래를 처리하는 경우, 이 “0.00000000000000004"라는 미세한 오차가 누적되어 장부 금액이 영원히 맞지 않게 될 것입니다. 기억하세요:

돈 문제에 있어서 어떠한 “근사치"도 재앙입니다.

회계사의 정밀한 장부: DECIMAL의 장점

“본 대로 얻는” 정확한 솔루션을 원한다면, DECIMAL이 데이터베이스에서 기본적으로 지원하는 고정 소수점 숫자이자 업계 표준 방법입니다.

DECIMAL은 회계사의 정밀한 장부와 같아서, 정수와 소수를 정확하게 나누어 저장하며 0.1 + 0.2가 무조건 0.3과 같도록 보장합니다.

업계의 황금 비율: DECIMAL(19, 4)

일반적으로 DECIMAL(19, 4) 사용을 권장합니다:

  • 19: 총 19자리 숫자(정밀도)를 저장할 수 있음을 나타냅니다.
  • 4: 소수점 이하 4자리를 유지함을 의미합니다.

왜 소수점 이하 4자리를 남겨둘까요? 이자, 세율, 환율을 계산하는 중간 과정에서 종종 소수점 이하 2자리를 초과하는 결과가 나오기 때문입니다. 추가로 2자리의 여유 공간을 확보하면 계산 정밀도가 향상되며, 마지막에 비즈니스 요구에 따라 반올림하기만 하면 됩니다.

이 용량은 심지어 여러 지구의 총 GDP를 살 수 있을 정도로 큽니다!

실제 금융 시나리오에서 충분할까?

**DECIMAL(19, 4)**를 예로 들어보겠습니다:

  • 정수 자릿수: 15자리
  • 최대 금액: 999,999,999,999,999
  • USD 환산: 약 999조 달러
참고치 금액
미국 GDP 약 27조 달러
전 세계 GDP 합계 약 105조 달러
전 세계 부의 합계 약 454조 달러

DECIMAL(19, 4)는 전 세계 부의 총합을 훨씬 초과하는 숫자를 수용할 수 있으며, 대다수의 금융 시스템에 완벽하게 충분합니다.

주요 데이터베이스가 지원하는 최대 DECIMAL 정밀도 한도

데이터베이스 최대 정밀도 (Precision)
MySQL / MariaDB 65
PostgreSQL 131072 (정수 자리) + 16383 (소수 자리)
SQL Server 38
Oracle 38

오락실의 토큰 기계: BIGINT 최소 단위법

궁극적인 성능 추구하거나, Stripe나 Alipay와 같이 초고속 동시성 처리가 요구되는 시스템이라면 **BIGINT(정수 저장법)**이 최고의 선택일 수 있습니다.

이 접근 방식은 오락실의 토큰 기계와 같습니다. 돈을 얼마나 넣든 기계가 이를 “최소 단위"로 변환하여 저장합니다. 예를 들어:

  • 100.50 미국 달러 → 10050(센트)으로 저장
  • 100 대만 달러 → 100(원)으로 저장

왜 BIGINT를 선택해야 할까?

이유 설명
엄청나게 빠른 속도 정수의 덧셈과 뺄셈은 CPU의 전문 분야이며, 계산 성능은 보통 DECIMAL보다 훨씬 빠릅니다.
공간 효율성 고정적으로 8바이트를 할당하여 초대형 데이터베이스에 매우 적합합니다.

하지만 단점은 가독성이 떨어진다는 것입니다. 데이터베이스를 열어서 10050을 볼 때, 머릿속(또는 코드)에서 자동으로 100으로 나누어야 합니다.

최종 대결: 어떻게 선택할까?

무엇을 사용할지 결정하려면 **“쿼리 빈도”**와 **“시스템 규모”**를 고려해볼 수 있습니다:

비교 항목 DECIMAL BIGINT
가독성 매우 우수 (숫자를 직접 읽음) 떨어짐 (수동 변환 필요)
계산 속도 보통 매우 빠름
적용 시나리오 ERP, 내부 재무 시스템, 일반 이커머스 고빈도 거래, 초대형 마이크로서비스, Stripe 스타일 API

실용적인 권장 사항

적용 시나리오 권장 필드
일반 이커머스, 회계사가 감사를 위해 직접 SQL을 실행해야 하는 사내 보고 시스템 DECIMAL(19, 4)
고빈도 거래 시스템, 또는 극한의 확장성 요구사항이 있는 경우 BIGINT

요약

간단히 말해서, 어떤 것을 선택하든 돈을 저장하는 데 FLOAT를 사용하는 것은 절대, 영구적으로 금지되어 있습니다! 올바른 필드 타입을 선택해야만 시스템이 재무 계산에서 바위처럼 견고하게 유지될 수 있습니다.

All rights reserved,未經允許不得隨意轉載
Hugo로 만듦
JimmyStack 테마 사용 중