정상성 검사
Source: Dev.to
왜 sanity 체크가 중요한가
프로덕션에서는 이상한 일들이 발생합니다. 테스트 커버리지가 아무리 높고, 데이터베이스 트랜잭션이 완벽하며, 경험이 수년이라 해도 예상치 못한 문제가 나타나지 않을 것이라는 보장은 없습니다.
데이터베이스에 sanity‑check 스크립트를 실행하면 이러한 이상 현상을 큰 문제가 되기 전에 잡아낼 수 있습니다. 제 경험상, 이 방법은 지난 20년간 신뢰할 수 있었습니다.
sanity 체크를 언제 추가해야 할까
데이터베이스에서 직접(또는 쉽게) 강제할 수 없는 비즈니스 규칙을 도입할 때마다, 해당 규칙을 위반하는 레코드를 스캔하는 기본 체크를 추가하세요.
예시 규칙
규칙: state = 'paid'인 경우 paid_at은 NULL이어서는 안 된다.
-- 규칙이 위반된 레코드 찾기
SELECT *
FROM payments
WHERE state = 'paid' AND paid_at IS NULL;
결과를 알림 시스템(예: PagerDuty, Slack, 이메일)으로 전송합니다.
일반적인 sanity‑check 패턴
-
외래키를 넘어선 참조 무결성
객체 X는 객체 Y에 속하며 두 객체는 동일한 Owner Z를 가져야 함. -
최소 관계 요구사항
- 모든 사용자는 최소 하나의 조직에 속해야 합니다.
- 모든 조직은 최소 하나의 사용자를 가져야 합니다.
-
특수 케이스 제약
- 슈퍼 관리자(super admin)로 표시된 사용자는 조직
Foo에만 속해야 합니다.
- 슈퍼 관리자(super admin)로 표시된 사용자는 조직
운영 팁
- 실행 빈도 – 중요한 제약 조건은 몇 분마다(예: 5분마다) 실행하고, 덜 긴급한 경우는 일일 배치로 예약합니다.
- 범위 – 잡음을 줄이기 위해 지난 48시간 내에 생성되거나 업데이트된 레코드만 검사합니다.
- 제외 항목 – 현재 운영과 무관한 보관된 레코드는 무시합니다.
- 배포 전 실행 – 새로운 코드를 배포하기 전에 체크를 수동으로 실행해, 불완전하거나 버그가 있는 sanity‑check 로직으로 인한 오탐으로 알림 시스템이 과부하되지 않게 합니다.
이러한 간단한 쿼리를 모니터링 파이프라인에 포함하면 데이터 이상을 조기에 포착하고 프로덕션 시스템을 보다 건강하게 유지할 수 있습니다.