현재 선택한 데이터 아키텍처 과정

DAsP 이론 학습

이론 목록으로 돌아가기

이력 유형과 유효기간 모델링

이력 모델은 과거 값을 단순 보관하는 것이 아니라 어떤 사건·상태·속성이 언제 효력을 가졌는지 재현하도록 설계합니다. 발생·변경·진행 이력을 구분하고, 시점형과 기간형의 경계·현재행·중복기간·소급변경 규칙을 명확히 해야 합니다.

예상 읽기 8

핵심 요약

이력 관리는 “누가 언제 수정했는가”만 기록하는 감사 로그와 다르다. 업무 질문에 따라 발생 사실, 속성 변경 전후, 처리 단계의 진행을 저장하고, 특정 시점의 유효 상태를 재현할 수 있어야 한다. 기간 이력은 시작·종료 경계를 한 가지 규칙으로 통일하고 같은 업무키의 유효기간이 겹치거나 비정상적으로 비지 않도록 통제한다.

학습 목표

  • 발생 이력, 변경 이력, 진행 이력의 목적과 구조를 구분한다.
  • 시점형 이력과 기간형 이력의 조회·갱신 차이를 설명한다.
  • 유효시작·종료 경계, 현재행 식별, 기간 중복을 판정한다.
  • 소급 변경·정정·취소가 기존 이력 구간에 미치는 영향을 설계한다.

1. 개념 설명

1.1 이력 요구를 먼저 질문으로 정의한다

이력 엔터티를 만들기 전에 과거에 답해야 할 질문을 구체화한다.

  • 2026년 7월 1일에 이 계약에 적용되던 수수료율은 얼마였는가?
  • 주문은 어떤 상태를 어떤 순서로 거쳐 출고되었는가?
  • 고객 주소가 언제, 어떤 사유로 변경되었는가?
  • 시스템이 8월 10일에 알고 있던 정보와 실제로 7월부터 유효했던 정보가 다른가?

질문이 “변경 시각”만 필요하면 사건 시점 이력으로 충분할 수 있다. 반면 과거 특정 날짜의 유효값을 재현하려면 시작·종료 기간이 필요하다.

1.2 발생·변경·진행 이력

이력 유형관리 대상대표 구조주요 질문
발생 이력독립적인 업무 사건·거래사건번호, 발생일시, 사건유형, 금액무엇이 언제 발생했는가?
변경 이력마스터 속성의 값 변화업무키, 버전, 변경전/후 값 또는 유효기간어느 시점에 어떤 값이 유효했는가?
진행 이력프로세스 상태와 단계 전이업무키, 상태, 시작·종료일시, 처리자어떤 상태를 어떤 순서·기간으로 거쳤는가?
  • 결제·입금·배송 사건은 발생 자체가 보존 대상이므로 발생 이력에 가깝다.
  • 고객등급·계약요율처럼 값의 효력 기간을 재현하면 변경 이력이다.
  • 주문접수→결제완료→출고준비→출고완료의 상태 흐름은 진행 이력이다.

하나의 업무에서 여러 유형이 함께 존재할 수 있다. 주문에는 주문상태 진행 이력과 결제 발생 이력이 동시에 필요하다.

1.3 시점형과 기간형

시점형은 변경 또는 사건이 발생한 한 시각만 저장한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
고객등급변경(고객번호, 변경일시, 변경전등급, 변경후등급, 변경사유)

변경 사건의 연속을 따라가면 당시 상태를 계산할 수 있지만, 특정 시점 조회가 복잡할 수 있다.

기간형은 각 버전이 유효한 구간을 저장한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
고객등급이력(고객번호, 유효시작일시, 유효종료일시, 고객등급코드)

특정 시점 t의 값은 유효시작 <= t < 유효종료인 행으로 찾을 수 있다. 기간형은 현재·과거 조회가 직관적이지만 구간 분할과 중복 통제가 필요하다.

1.4 유효시간과 기록시간

  • 유효시간(valid time): 업무 세계에서 값이 실제로 효력을 갖는 기간
  • 기록시간(transaction/system time): 데이터베이스에 그 사실이 기록되어 있던 기간

예를 들어 8월 10일에 “7월 1일부터 적용된 요율”을 소급 등록하면 유효시작은 7월 1일이고 기록시작은 8월 10일이다. 두 시간을 모두 요구하는 이중 시간 모델은 강력하지만 복잡하므로 감사·분쟁·소급처리 요구가 명확할 때 선택한다. 이 구분은 제품의 자동 시간 이력 기능과 동일하다고 단정하지 않고 논리 모델 관점에서 이해한다.

1.5 기간 경계 규칙

기간은 포함·제외 경계를 명시해야 한다. 가장 계산하기 쉬운 방식 중 하나는 반개구간 [시작, 종료)이다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
버전 1: [2026-01-01 00:00, 2026-07-01 00:00)
버전 2: [2026-07-01 00:00, 9999-12-31 00:00)

이 규칙에서는 이전 버전의 종료값과 다음 버전의 시작값을 같게 두어도 겹치지 않는다. 일자 단위로 종료일을 포함하는 업무라면 시작일 <= 기준일 <= 종료일 규칙을 사용할 수 있으나 다음 버전 시작일과 하루 차이인지, 시간대·자정 처리가 어떤지 문서화해야 한다.

현재행은 다음 방식 중 하나로 식별할 수 있다.

  • 종료값을 NULL로 둔다.
  • 종료값을 표준 최대값으로 둔다.
  • 현재여부를 별도 속성으로 둔다.
  • 현재 테이블과 이력 테이블을 분리한다.

중복 수단을 동시에 쓰면 서로 불일치할 수 있으므로 한 가지를 주 기준으로 정하고 나머지는 파생·검증 값으로 관리한다.

2. 이력 모델 설계 항목

항목결정 내용검증 질문
이력 대상엔터티 전체 또는 일부 속성어떤 과거 질문에 필요하나?
이력 유형발생·변경·진행사건인가, 값 버전인가, 상태 단계인가?
시간 단위일자·초·밀리초 등같은 단위에서 동시 변경이 가능한가?
경계 규칙[시작, 종료) 또는 포함 종료경계 시각에 두 행이 동시에 유효하지 않은가?
현재행 규칙NULL·최대값·현재여부·분리 테이블현재행이 한 건만 존재하는가?
중복·공백금지 또는 허용 조건동일 업무키의 기간이 겹치거나 비어도 되는가?
변경 사유코드·근거 문서·처리자정정과 정상 변경을 구분하는가?
소급 처리구간 분할·기존값 정정·기록시간과거 조회 결과가 어떻게 바뀌는가?
보존 정책기간·삭제·아카이빙법적·업무 보존 요구를 만족하는가?

3. 기간 이력 갱신 흐름

3.1 정상 미래 변경

현재 요율이 5%이고 2026-09-01부터 6%가 적용된다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
변경 전
[2026-01-01, 9999-12-31)  5%

변경 후
[2026-01-01, 2026-09-01)  5%
[2026-09-01, 9999-12-31)  6%

기존 행의 종료를 새 행 시작과 맞추고 새 현재행을 추가한다.

3.2 기간 중간의 소급 변경

8월 10일에 7월 15일부터 8월 1일까지 5.5%였음을 정정한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
[2026-01-01, 2026-07-15)  5%
[2026-07-15, 2026-08-01)  5.5%
[2026-08-01, 2026-09-01)  5%
[2026-09-01, 9999-12-31)  6%

기존 구간을 앞·삽입·뒤 구간으로 분할해야 한다. 수정 트랜잭션 중 일시적으로 중복이나 공백이 생기지 않도록 원자적으로 처리한다.

3.3 취소와 정정

  • 정상 변경의 취소: 이후 상태가 무엇으로 복원되는지 정의한다.
  • 오입력 정정: 잘못된 사실을 삭제할지, 정정 이력 자체를 남길지 정한다.
  • 업무 사건 취소: 원 사건을 삭제하기보다 반대 사건이나 취소 상태로 보존할 수 있다.

감사 요구가 있는 경우 과거 행을 물리 삭제·덮어쓰기하면 변경 흔적이 사라지므로 정정 방식과 권한을 구분한다.

4. 사례

계약조건 이력

계약별 수수료율이 효력일 기준으로 변경되고, 같은 계약의 유효기간은 겹칠 수 없다고 하자.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
계약조건이력(
  계약번호,
  유효시작일자,
  유효종료일자,
  수수료율,
  변경사유코드,
  등록일시,
  등록자
)

후보키: (계약번호, 유효시작일자)
업무 규칙:
- 유효시작일자 < 유효종료일자
- 같은 계약의 유효기간은 중복 금지
- 기준일 d의 조건은 시작일 <= d < 종료일
- 현재 구간은 계약별 최대 1건

단순 PK만으로는 기간 겹침을 막을 수 없다. DBMS의 기간 제약 기능, 트랜잭션 내 잠금·검증, 전용 변경 API 등 구현 수단을 물리 설계에서 선택한다.

5. 비교와 구분

구분목적대표 속성주의점
감사 로그누가 어떤 명령을 실행했는지 추적처리자, 처리일시, 변경내용업무 유효 상태 재현과 다를 수 있음
발생 이력독립 사건 보존발생일시, 사건유형, 금액취소를 삭제로 처리하지 않도록 검토
변경 이력속성 값 버전 보존유효시작·종료, 값중복·공백·소급 변경
진행 이력상태 전이와 체류시간 보존상태, 시작·종료, 처리자허용 전이 순서와 동시 상태
현재값 테이블최신 조회 단순화현재 속성이력과 동기화 책임 필요

시험 판단 포인트

  • 수정일시 한 컬럼은 과거 값 자체를 보존하지 않으므로 변경 이력 모델이 아니다.
  • 기간형 이력에서는 경계 포함 여부와 현재행 규칙을 반드시 확인한다.
  • 같은 업무키의 기간 중복은 PK만으로 방지되지 않는 경우가 많다.
  • 소급 변경은 기존 구간을 분할할 수 있으며 유효시간과 기록시간이 달라질 수 있다.
  • 모든 속성을 무조건 이력화하지 말고 과거 재현·감사·분쟁·분석 요구를 근거로 대상을 선택한다.

자주 틀리는 부분

  • 변경일자만 저장하면 특정 시점 값을 바로 재현할 수 있다고 본다.
  • 종료일 포함 규칙과 다음 시작일을 같은 값으로 두어 하루 또는 한 시각이 중복되게 한다.
  • 현재여부=Y와 종료일 최대값을 모두 수기로 관리하면서 불일치 통제를 두지 않는다.
  • 소급 변경 시 기존 행 하나의 값만 덮어써 과거 구간의 사실을 잃는다.
  • 발생 이력과 진행 이력을 한 테이블의 상태코드만으로 모두 표현하려 한다.
스스로 확인하기

개념 확인 문제

문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.

01객관식 다음 중 기간형 이력의 반개구간 [시작, 종료) 규칙에 대한 설명으로 옳은 것은? A. 시작과 종료 시각을 모두 포함한다. B. 시작 <= 기준시각 < 종료인 행이 유효하다. C. 현재행은 반드시 종료일이 NULL이어야 한다. D. 이전 종료와 다음 시작이 같으면 두 기간이 겹친다.
정답 및 해설

세 구간을 하나의 트랜잭션에서 분할·삽입해 중복과 공백을 방지한다.

02객관식 주문의 상태가 접수→결제→출고로 진행된 순서와 각 상태의 체류시간을 관리하려 한다. 가장 직접적인 이력 유형은? A. 발생 이력 B. 진행 이력 C. 단순 감사 로그 D. 파생 속성
정답 및 해설

소급정정 사유, 승인자, 접수일시(기록시간)를 남긴다.

03참·거짓 “동일 계약의 유효기간 이력에서 (계약번호, 유효시작일자)를 PK로 지정하면 서로 다른 시작일을 가진 기간의 중복도 자동으로 방지된다.”
정답 및 해설

정정이 이미 계산된 청구·정산에 미치는 재처리 범위를 정의한다.

04기간 판독 다음 이력이 [시작, 종료) 규칙을 따른다. 2026-06-30 23:59와 2026-07-01 00:00에 각각 유효한 등급을 쓰시오. text [2026-01-01 00:00, 2026-07-01 00:00) SILVER [2026-07-01 00:00, 9999-12-31 00:00) GOLD
정답 및 해설

동일 계약의 기간 중복 금지와 시작<종료 검증을 수행한다.

05설계 문제 현재 이력이 [2026-01-01, 9999-12-31) 5% 한 건이다. 2026-08-10에 “2026-07-15부터 2026-08-01 전까지는 5.5%였다”는 소급 정정이 접수되었다. 변경 후 구간을 작성하고 추가로 기록할 통제 항목을 제시하시오.
정답 및 해설

정정 전 데이터도 감사상 보존해야 하는지 결정한다.

유효시작 7월 15일과 실제 등록일 8월 10일을 구분해야 소급 사실을 정확히 설명할 수 있다.