제8장: 고급 SQL 기능 – 뷰, 트리거, 저장 프로시저
뷰(View): 복잡한 쿼리를 단순하게
PostgreSQL에서 뷰(View)는 자주 사용하는 SELECT 문을 하나의 데이터베이스 객체로 저장하는 기능입니다. 뷰는 실제 데이터를 보관하지 않고, 사용자가 뷰를 호출할 때마다 해당 쿼리를 실행해 결과를 보여줍니다. 이를 통해 복잡한 SQL 로직을 재사용하거나, 테이블 구조를 감추어 보안을 높일 수 있습니다.
뷰를 생성하려면 다음과 같이 작성합니다:
CREATE VIEW active_users AS
SELECT id, name FROM users WHERE status = 'active';
이제 active_users
뷰를 테이블처럼 조회할 수 있어, 반복되는 조건문 없이 결과를 쉽게 얻을 수 있습니다.
뷰는 실제 데이터를 저장하지 않아 공간을 차지하지 않으며, 다수의 테이블을 조합하는 쿼리도 깔끔하게 감출 수 있습니다. 또한, 뷰 위에 뷰를 쌓는 것도 가능하므로, 점진적으로 복잡한 데이터 논리를 계층적으로 정리할 수 있습니다.
트리거(Trigger): 자동화와 무결성의 핵심
트리거(Trigger)는 데이터베이스에서 특정 이벤트(예를 들어, INSERT, UPDATE, DELETE)가 일어날 때 자동으로 지정한 함수를 실행하는 메커니즘입니다. 업무 규칙이나 데이터 무결성, 변경 이력 관리 등을 데이터베이스 수준에서 자동화하고 싶을 때 빛을 발합니다.
트리거를 만들려면 먼저 트리거 함수(Trigger Function)를 정의합니다. 예를 들어, 사용자가 추가될 때마다 로그를 남기고 싶다면 다음과 같이 작성할 수 있습니다:
CREATE OR REPLACE FUNCTION log_user_insert() RETURNS trigger AS $$
BEGIN
INSERT INTO user_log(user_id, log_time, action) VALUES (NEW.id, now(), 'insert');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_user_insert
AFTER INSERT ON users
FOR EACH ROW EXECUTE FUNCTION log_user_insert();
이제 사용자가 추가될 때마다 자동으로 user_log 테이블에 기록이 남게 됩니다. 트리거는 데이터 변화에 즉각 반응하므로, 중요한 감사(audit) 로그나 비즈니스 규칙을 DB에서 직접 보장할 때 유용합니다.
저장 프로시저(Stored Procedure): 재사용 가능한 데이터베이스 로직
저장 프로시저(Stored Procedure)는 자주 반복되거나 복잡한 데이터 처리 로직을 데이터베이스 내부에 저장해두고, 필요할 때마다 호출할 수 있는 기능입니다. 반복되는 연산, 복합 조건 분기, 배치 작업 등에 활용하면 업무 자동화와 유지보수가 쉬워집니다.
다음 예시는 새로운 주문을 등록하고 관련 재고를 동시에 수정하는 저장 프로시저입니다:
CREATE OR REPLACE PROCEDURE process_order(p_user_id INT, p_product_id INT, p_quantity INT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO orders(user_id, product_id, quantity, order_time)
VALUES (p_user_id, p_product_id, p_quantity, now());
UPDATE products SET stock = stock - p_quantity WHERE id = p_product_id;
END;
$$;
사용할 때는 CALL process_order(1, 2, 3);
식으로 한 번에 실행됩니다. 저장 프로시저는 트랜잭션 내에서 다양한 작업을 묶어 실행할 수 있고, 실행 로직을 DB에 고정함으로써 애플리케이션과의 의존성을 줄여줍니다.
실전 활용의 포인트
뷰, 트리거, 저장 프로시저는 단순한 쿼리를 넘어 데이터베이스의 활용도를 한층 끌어올려주는 도구입니다. 비즈니스 규칙을 데이터베이스에 내재화하고, 반복적인 데이터를 자동으로 관리하는 기반을 마련해줍니다. 이를 적절히 조합하면, 일관성 있는 데이터 처리와 업무 효율성을 모두 확보할 수 있습니다. PostgreSQL의 확장성은 이 세 가지 고급 기능에서 빛을 발하며, 탄탄한 시스템 설계를 가능케 합니다.