피드로 돌아가기
CONSISTENCY
Dev.toDev.to
Database

CONSISTENCY

데이터베이스 CHECK 제약조건과 애플리케이션 레벨 검증을 조합하여 계좌 잔액 음수 방지

Abinaya Dhanraj2026년 3월 25일5beginner

Context

데이터베이스에서 음수 잔액 같은 비즈니스 규칙 위반 데이터가 저장될 수 있는 문제가 존재했습니다. 단순히 쿼리 실행 후 결과를 확인하는 방식으로는 제약조건 위반을 사전에 차단할 수 없었습니다.

Technical Solution

  • CHECK 제약조건 추가: 데이터베이스 스키마에 CHECK (balance >= 0) 제약조건을 정의하여 모든 INSERT/UPDATE 작업에서 음수 값 차단
  • 직접 값 할당 차단: UPDATE accounts SET balance = -100 형태의 직접 음수 할당 시도는 CHECK 제약조건으로 즉시 거부
  • 음수 결과 연산 차단: UPDATE accounts SET balance = balance - 1500 같이 결과가 음수가 되는 산술 연산도 제약조건으로 차단
  • 트랜잭션 내 검증: BEGIN/COMMIT 트랜잭션 내에서도 UPDATE 단계에서 제약조건을 검사하여 거래 실패 처리
  • 쿼리 레벨 사전 검증: UPDATE accounts SET balance = balance - 1200 WHERE balance >= 1200 형태로 충분한 잔액 확인 조건을 쿼리에 포함하여 실패 전에 예방

Key Takeaway

데이터 일관성 보호는 데이터베이스 스키마 제약조건으로 마지막 방어선을 구축하되, 애플리케이션이나 쿼리 레벨에서 사전 검증 로직을 추가하면 불필요한 트랜잭션 실패를 줄일 수 있습니다.


금융 거래나 잔액 관리 기능을 개발할 때 CHECK 제약조건으로 스키마 레벨 보호를 설정하고, 동시에 UPDATE 쿼리에 AND 조건으로 잔액 충분성을 확인하면 거래 실패율을 감소시키고 데이터 무결성을 보장할 수 있습니다.

원문 읽기
CONSISTENCY | Devpick