고객의 새 계약 단가를 저장했더니 지난달 사용료까지 새 가격으로 다시 계산됩니다. 단가 테이블에 현재 값만 남긴 시스템에서 생길 수 있는 문제입니다. 계약은 숫자뿐 아니라 언제, 누구에게, 어떤 조건으로 유효한지를 가진 약속입니다. 과거 계산을 설명하려면 현재 상태와 적용 이력을 분리해야 합니다.
적용 시각과 기록 시각은 다르다
계약이 다음 달부터 적용되도록 오늘 입력될 수 있고, 지난주부터 적용된 변경을 오늘 등록할 수도 있습니다. 업무상 유효한 시각과 시스템이 사실을 알게 된 시각은 서로 다른 축입니다. 단순한 수정일 하나로 두 의미를 모두 표현하기 어렵습니다.
우선 단가의 적용 시작과 종료, 계약 버전, 기록 시각을 구분해 저장합니다. 과거 어느 날 시스템이 무엇을 알고 있었는지까지 재현해야 한다면 기록 이력도 보존하는 이중 시간 모델을 검토합니다. 필요한 질문부터 정하고 복잡도를 선택합니다.
기간의 경계를 명확히 한다
이전 단가의 종료 시각과 새 단가의 시작 시각이 같을 때 두 값이 동시에 선택되거나 모두 빠지지 않아야 합니다. 시작 포함·종료 제외처럼 일관된 구간 규칙을 정합니다. 날짜 단위 계약이라도 기준 시간대와 하루의 시작을 정의합니다.
같은 고객·상품·조건에 적용 기간이 겹치지 않도록 검증하고, 비어 있는 기간에는 기본 단가를 쓸지 계산을 중단할지 정합니다. 겹친 값 중 최신 수정값을 임의로 고르면 입력 실수가 정상 청구처럼 숨어들 수 있습니다.

늦게 들어온 사용량은 발생 기준을 본다
가상 사례로 월말에 발생한 사용량이 다음 달에 수집됐다고 해 봅시다. 계약이 사용 발생일 기준이라면 수신일의 단가가 아니라 발생 당시의 유효 단가를 찾아야 합니다. 반대로 다른 기준을 약정했다면 그 규칙을 따라야 합니다.
사용 이벤트에는 발생 시각과 수신 시각, 고유 식별자를 함께 남깁니다. 시계 오류나 누락된 발생 시각은 별도 검토 대상으로 분리합니다. 단순히 서버에 들어온 순간을 모든 거래의 업무 시각으로 삼는 것은 편리하지만 위험한 가정입니다.
확정 청구를 재계산 결과로 덮어쓰지 않는다
청구가 확정되면 적용한 단가 버전과 수량, 할인 조건, 반올림 규칙을 결과에 연결합니다. 단가 표를 수정한 뒤 과거 청구 화면을 다시 열었을 때 다른 금액이 표시돼서는 안 됩니다. 확정 결과와 현재 조건으로 만든 시뮬레이션을 구분합니다.
소급 변경이 필요하면 승인된 정정 범위와 차액을 별도로 기록합니다. 원청구와 조정 내역이 연결돼야 고객 설명과 내부 검증이 가능합니다. 구체적인 청구·회계 처리 방식은 계약 및 해당 업무의 기준을 담당자와 확인해야 합니다.

조회 API도 기준을 드러낸다
단가 조회에 고객과 상품만 받으면 현재 단가인지 특정 시점의 단가인지 모호해집니다. 기준 시각과 계약 조건을 명시적으로 받고 선택된 버전 및 유효기간을 반환하면 이후 계산을 추적하기 쉽습니다.
캐시에도 계약 버전이나 적용 구간을 반영해야 합니다. 단가 변경 시 현재 가격 캐시만 비우고 과거 조회 결과까지 같은 키로 저장하면 혼동이 생깁니다. 계산 작업이 시작된 뒤 계약이 수정되는 경우에도 어떤 버전을 고정할지 정합니다.
시간 경계에 테스트를 집중한다
월말과 월초, 시간대 차이, 계약 시작 직전과 직후, 소급 변경, 중복 기간, 늦은 사용량을 테스트합니다. 현재 날짜만 사용한 정상 사례로는 과거 정산의 오류를 발견하기 어렵습니다. 미래 적용 계약을 미리 등록하는 경우도 확인합니다.
관리 화면에는 현재 단가뿐 아니라 예정 단가와 과거 이력을 함께 보여 줍니다. 변경 사유와 승인자를 남기고 영향받는 미확정 계산을 미리 확인할 수 있게 합니다. 잘 설계된 시간 데이터는 과거를 보존하면서 미래 변경을 준비하게 해 줍니다.
실무 체크리스트
- 업무 적용 시각과 시스템 기록 시각을 구분했는가
- 단가 기간의 겹침·공백·시간대 규칙이 있는가
- 확정 청구가 당시 계약 버전을 보존하는가
참고 자료: Martin Fowler의 Effectivity 패턴. Effectivity는 시간 구간에 따라 사실의 유효성을 표현하는 설계 패턴입니다. 청구 승인 절차와 소급 정정 방법은 각 서비스의 계약 및 업무 기준에 맞춰 별도로 정해야 합니다.
본문 이미지는 이해를 돕기 위해 생성한 개념 삽화이며 실제 측정 자료나 고객 현장 사진이 아닙니다.
#계약관리 #단가관리 #유효기간 #이력데이터 #SaaS #정산설계 #시간데이터 #청구시스템 #데이터모델링 #백엔드