요구사항 정리
PostgreSQL을 사용하여 특정 설정값(threshold 등)을 관리해야 하는 상황이 있었습니다. 요구사항은 다음과 같았습니다.
- 설정값을 데이터베이스에 저장하고, 나중에 읽어올 수 있어야 함
- 설정값이 변경될 때마다 이력을 남기고, 기존 값을 덮어쓰지 않아야 함
- 항상 가장 최신의 설정값을 쉽게 조회할 수 있어야 함
- 나중에 다른 설정값이 추가될 수도 있으므로, 확장성 있게 설계하고자 함
이러한 조건을 만족시키기 위해 다음과 같은 방식으로 스키마를 설계하였습니다.
테이블 설계 방향
설정값의 이름과 값을 key-value 형태로 저장하는 방식으로 테이블을 구성하였고, 이력 관리를 위해 created_at
컬럼을 추가하였습니다.
테이블 구조 예시
CREATE TABLE config_history (
id SERIAL PRIMARY KEY,
config_key TEXT NOT NULL, -- 설정 이름 (예: 'score_threshold')
config_value DOUBLE PRECISION NOT NULL, -- 설정 값 (예: 0.85)
config_type TEXT, -- 설정 유형 (예: 'threshold')
created_at TIMESTAMP DEFAULT NOW(), -- 생성 시각
updated_by TEXT -- 설정 변경자 (선택 사항)
);
config_key
: 어떤 설정값인지 구분하기 위한 키config_value
: 해당 설정값의 실제 수치config_type
: threshold, limit 등 설정의 분류 (확장용)created_at
: 이력 관리용 타임스탬프updated_by
: 누가 변경했는지 추적 가능
설정값 변경 예시
새로운 설정값을 저장할 때는 항상 INSERT
를 사용합니다.
-- 예: score_threshold를 0.85로 설정
INSERT INTO config_history (config_key, config_value, config_type, updated_by)
VALUES ('score_threshold', 0.85, 'threshold', 'admin_user');
-- 예: probability_threshold를 0.9로 설정
INSERT INTO config_history (config_key, config_value, config_type, updated_by)
VALUES ('probability_threshold', 0.9, 'threshold', 'admin_user');
기존 값을 업데이트하지 않고 새로 insert함으로써, 모든 이력을 자동으로 관리할 수 있습니다.
최신 설정값 조회하기
모든 설정값(config_key)에 대해 가장 최신의 설정값을 조회하는 쿼리는 두 가지 방식으로 구현할 수 있습니다.
방법 1. DISTINCT ON
(PostgreSQL 전용)
SELECT DISTINCT ON (config_key)
config_key,
config_value,
config_type,
created_at
FROM config_history
ORDER BY config_key, created_at DESC;
방법 2. ROW_NUMBER()
서브쿼리 사용
SELECT config_key, config_value, config_type, created_at
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY config_key ORDER BY created_at DESC) AS rn
FROM config_history
) t
WHERE rn = 1;
최신값 뷰(View)로 관리
매번 쿼리로 작성하는 것이 번거롭다면, 뷰를 만들어두는 것도 좋은 방법입니다.
CREATE OR REPLACE VIEW latest_config AS
SELECT DISTINCT ON (config_key)
config_key,
config_value,
config_type,
created_at
FROM config_history
ORDER BY config_key, created_at DESC;
필요할 때는 다음과 같이 간단하게 조회할 수 있습니다:
SELECT * FROM latest_config;
마무리
이번 설계를 통해 다음과 같은 장점을 확보할 수 있었습니다.
항목 | 설명 |
---|---|
이력 관리 | 모든 설정값 변경사항이 자동으로 저장됨 |
최신값 추출 | 간단한 쿼리 또는 뷰로 관리 가능 |
확장성 | 새로운 설정 항목도 쉽게 추가 가능 |
변경 추적 | 누가 언제 어떤 설정을 바꿨는지 기록 가능 |
향후에는 특정 시간 기준의 설정 조회, 사용자별 변경 내역 조회 등으로도 확장할 수 있습니다. threshold 값을 버전처럼 관리하고 싶은 분들께 추천드리는 설계 방식입니다.
반응형
'개발 (Development) > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법 (0) | 2025.07.27 |
---|---|
[PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화 (1) | 2025.07.05 |
[PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법 (0) | 2025.05.25 |
[PostgreSQL] 시퀀스 자동 증가 설정과 오류 해결 방법 정리 (0) | 2025.05.18 |
[PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링 (0) | 2025.04.26 |