피드로 돌아가기
Dev.toDatabase
원문 읽기
Consistency
PostgreSQL의 CHECK 제약 조건과 트랜잭션을 결합하여 음수 잔액 상태로의 데이터 불일치 방지
AI 요약
Context
데이터베이스에서 계좌 잔액과 같은 중요한 상태를 관리할 때, 유효하지 않은 데이터(음수 잔액)가 저장되는 것을 방지해야 한다. 이는 비즈니스 규칙 위반으로 이어지며 시스템의 일관성을 손상시킨다.
Technical Solution
- CHECK 제약 조건 적용: PostgreSQL의 CHECK (balance >= 0) 제약으로 스키마 수준에서 음수 잔액 업데이트 차단
- 트랜잭션 래핑: BEGIN과 COMMIT으로 UPDATE 작업을 감싸서 제약 위반 시 자동 롤백
- 애플리케이션 레벨 검증 추가: UPDATE 쿼리 실행 전 WHERE 절에서 잔액 충분성 확인 (balance >= 200)
- 다층 방어 구조: 애플리케이션 로직과 데이터베이스 제약을 조합하여 유효하지 않은 상태 진입 방지
Key Takeaway
데이터 일관성은 단일 계층의 검증만으로는 부족하며, 애플리케이션 로직(조기 차단)과 데이터베이스 제약(최종 안전망)의 이중 검증 구조가 필요하다.
실천 포인트
금융 거래, 재고 관리 등 음수가 불가능한 도메인을 다루는 서비스에서 CHECK 제약 조건으로 스키마 수준의 제약을 먼저 설정하고, 트랜잭션 내에서 사전 조건 검사(WHERE balance >= amount)를 추가하면 유효하지 않은 상태 진입을 근본적으로 차단할 수 있다.