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