And Brain said,
PostgreSQL Custom type, 데이터 타입 공예술 본문

PostgreSQL은 단순한 관계형 데이터베이스를 넘어서, 다양한 고유한 기능들로 많은 개발자들 사이에서 사랑받고 있습니다. 오늘은 그중에서도 사용자 정의 데이터 타입(Custom Data Types) 기능에 대해 소개해보겠습니다.
PostgreSQL에서는 사용자 정의 데이터 타입을 만들 수 있습니다. 예를 들어, 특정 비즈니스 요구에 맞는 새로운 데이터 타입을 정의하거나, 복잡한 객체를 저장할 수 있는 구조체를 생성할 수 있습니다. 이를 통해 데이터베이스에서의 작업을 훨씬 더 직관적이고 효율적으로 만들 수 있습니다.
사용자 데이터 타입을 사용하는 이유
우리가 일반적으로 사용하는 INT, TEXT, BOOLEAN 같은 타입만으로는 현실 세계의 데이터를 완벽하게 담아내기 어렵습니다. 사용자 정보, 지리적 데이터, 로그 변경 내역, 가격 범위 같은 복잡한 구조를 보다 직관적으로 다루려면, 데이터의 형태 자체를 다듬어야 합니다.
복합 타입(Composite Type)
복합 타입은 여러 개의 속성을 하나의 컬럼에 저장하는 개념입니다.
CREATE TYPE으로 복합 타입 만들기
CREATE TYPE person AS (
first_name TEXT,
last_name TEXT,
birth_date DATE
);
이제 이 타입을 컬럼처럼 사용할 수 있습니다.
복합 타입을 포함한 테이블 생성
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
personal_info person
);
데이터 삽입 및 조회
INSERT INTO employees (personal_info) VALUES (ROW('Bob', 'Smith', '1985-03-15'));
SELECT personal_info FROM employees;
SELECT (personal_info).first_name FROM employees;
한 컬럼에 여러 필드를 저장할 수 있어, 테이블 구조가 더 간결해짐
사용자 정의 연산자 & 함수
데이터 타입이 만들어졌다면, 이제 이를 다루는 방법도 직접 정의할 수 있습니다.
PostgreSQL은 기본적으로 = (등호), +, -, <, > 같은 연산자(operator) 를 제공하지만, 사용자 정의 타입에는 자동으로 적용되지 않습니다.
따라서, 우리가 만든 person 타입에 대해 이름과 성이 같은지 비교하는 = 연산자를 직접 정의해야 합니다.
PostgreSQL은 사용자 정의 연산자와 함수를 지원하여, 새로운 타입에 맞는 커스텀 로직을 추가할 수 있습니다.
사용자 정의 비교 연산자 만들기
CREATE FUNCTION person_equal(person, person) RETURNS BOOLEAN AS $$
BEGIN
RETURN $1.first_name = $2.first_name AND $1.last_name = $2.last_name;
END;
$$ LANGUAGE plpgsql;
CREATE OPERATOR = (
LEFTARG = person,
RIGHTARG = person,
FUNCTION = person_equal
);
연산자 사용 예제
SELECT (ROW('Alice', 'Doe', '1990-05-10')::person = ROW('Alice', 'Doe', '1990-05-10')::person) AS is_equal;
이제 person 타입끼리 = 연산자를 사용할 수 있습니다.
사용자 정의 범위 타입으로 숫자 구간 처리하기
PostgreSQL은 기본적인 int4range, daterange 같은 범위 타입을 제공하지만, 특정 비즈니스 로직에 맞게 커스텀 범위 타입을 만들 수도 있습니다.
가격 범위를 저장하는 price_range 타입 만들기
CREATE TYPE price_range AS RANGE (
subtype = NUMERIC,
subtype_diff = float8mi
);
price_range를 사용하는 테이블 만들기
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
price_range price_range
);
데이터 삽입 및 조회
INSERT INTO products (name, price_range) VALUES ('Laptop', '[1000, 2000]');
SELECT * FROM products WHERE price_range @> 1500;
가격 필터링, 예약 시스템, 시간 간격 검색 등에 활용 가능.
트리거와 사용자 정의 타입을 결합하여 변경 로그 관리하기
데이터가 변경될 때마다 변경 이력을 남겨야 하는 경우, 트리거와 사용자 정의 타입을 함께 활용하면 깔끔한 데이터 추적이 가능합니다.
변경 로그를 위한 사용자 정의 타입 생성
CREATE TYPE change_log AS (
old_value TEXT,
new_value TEXT,
changed_at TIMESTAMP DEFAULT now()
);
로그를 저장할 테이블과 트리거 적용
CREATE TABLE settings (
id SERIAL PRIMARY KEY,
name TEXT,
value TEXT
);
CREATE TABLE settings_log (
id SERIAL PRIMARY KEY,
log change_log
);
데이터 변경 시 로그를 남기는 트리거 함수
CREATE FUNCTION log_changes() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO settings_log (log)
VALUES (ROW(OLD.value, NEW.value, now()));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER track_changes
BEFORE UPDATE ON settings
FOR EACH ROW EXECUTE FUNCTION log_changes();
데이터 변경 이력을 자동으로 기록할 수 있어, 감사(Audit) 로그 관리에 유용.
끝으로
PostgreSQL의 사용자 정의 데이터 타입을 활용하면 단순한 데이터 저장을 넘어 더 직관적이고 최적화된 데이터 모델링이 가능해집니다.
기본 제공되는 INT, TEXT 같은 타입만으로는 현실의 복잡한 데이터를 표현하기 어렵지만, 복합 타입(Composite Type), 사용자 정의 연산자, 범위 타입(Range Type), 그리고 트리거와의 결합을 통해 더 구조적인 데이터베이스 설계가 가능합니다.
사용자 정의 타입을 적극 활용하여 더 유연하고 강력한 데이터 모델을 구축해보세요!
'IT > Database' 카테고리의 다른 글
PostgreSQL, postgres 관리자 계정 주요 쿼리 정리 (0) | 2025.03.14 |
---|---|
DB Partitioning, 거대한 데이터를 지탱하기 위한 DB의 슬래브 구조 (0) | 2025.03.14 |
AWR (Automatic Workload Repository), 오라클 DB의 진술문 (0) | 2025.03.13 |
MSSQL, sa 관리자 계정 주요 쿼리 정리 (0) | 2025.03.06 |
MSSQL, 주요 쿼리 정리 (0) | 2025.03.05 |