티스토리 뷰

오늘은 시스템을 설계하는 과정에서 이력관리하는 방법에 대해 간략히 알아보겠습니다. 시스템에서 이력관리는 필수라고 할 수 있는데요, 특히 데이터가 "언제부터 언제까지 유효했는지" 또는 "언제 어떤 변경이 있었는지" 를 관리해야 할 때 방식의 차이가 중요합니다. 대표적인 이력관리 방식인 선분이력과 점이력에 대해 알아보겠습니다.


1. 선분이력이란?

선분이력은 데이터의 유효 기간을 선분(기간) 으로 관리하는 방식입니다.

  • 시작일(From) 과 종료일(To) 을 함께 저장
  • 하나의 레코드는 특정 기간 동안의 상태를 의미
  • "어떤 시점에 유효한 데이터"를 조회하기 쉬움

보통 현재 데이터 + 과거 데이터를 한 테이블에서 관리할 때 많이 사용하는 방식


2. 선분이력의 예제

CREATE TABLE employee_history (
    emp_id      BIGINT,
    dept_name   VARCHAR(50),
    valid_from  DATE,
    valid_to    DATE
);


| emp_id | dept_name | valid_from | valid_to   |
| ------ | --------- | ---------- | ---------- |
| 1      | 개발팀       | 2020-01-01 | 2022-12-31 |
| 1      | 기획팀       | 2023-01-01 | 9999-12-31 |
  • valid_to = 9999-12-31 -> 현재 유효 데이터
  • 특정 날짜 기준 조회가 직관적
-- 2021-06-01 기준 소속 부서
SELECT *
FROM employee_history
WHERE emp_id = 1
  AND '2021-06-01' BETWEEN valid_from AND valid_to;

3. 점이력이란?

점이력은 변경이 발생한 시점(포인트)만 기록하는 방식입니다.

  • 변경 시점 하나만 저장
  • 데이터의 상태 변화 이력을 이벤트처럼 관리
  • 로그성, 감사(Audit) 목적에 적합

"언제 어떤 변경이 있었는지" 추적할 때 사용


4. 점이력의 예제

CREATE TABLE employee_history_point (
    emp_id      BIGINT,
    dept_name   VARCHAR(50),
    changed_at  TIMESTAMP
);

| emp_id | dept_name | changed_at       |
| ------ | --------- | ---------------- |
| 1      | 개발팀       | 2020-01-01 09:00 |
| 1      | 기획팀       | 2023-01-01 10:30 |
  • 각 행은 변경 이벤트
  • 기간 개념은 직접 계산해야 함
-- 가장 최근 상태 조회
SELECT *
FROM employee_history_point
WHERE emp_id = 1
ORDER BY changed_at DESC
LIMIT 1;

5. 비교

이력 표현 기간(From~To) 변경 시점
데이터 의미 해당 기간 동안의 상태 변경 이벤트
특정 시점 조회 매우 쉬움 계산 필요
변경 이력 추적 상대적으로 약함 매우 강함
데이터 구조 조금 복잡 단순
주 사용 목적 기준일 조회, 업무 데이터 감사, 로그, 변경 추적
  • 선분이력은 "이 날짜에 어떤 데이터가 유효했는지"가 중요하면 선택
  • 점이력은 "언제 어떤 변경이 있었는지"를 추적해야 하면 선택

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday