저장 프로시저(Stored Procedure)는 데이터베이스 서버에 미리 컴파일되어 저장된 SQL 코드 블록이다. 이름으로 호출할 수 있으며, 복잡한 비즈니스 로직을 DB 레벨에서 처리한다. 네트워크 트래픽 감소, 코드 재사용, 보안 강화 등의 장점이 있다.
기본 문법
PostgreSQL (PL/pgSQL)
sql
CREATE OR REPLACE PROCEDURE transfer_money(
p_from_account INT,
p_to_account INT,
p_amount DECIMAL
)
LANGUAGE plpgsql
AS $$
DECLARE
v_balance DECIMAL;
BEGIN
-- 잔액 확인
SELECT balance INTO v_balance
FROM accounts WHERE id = p_from_account
FOR UPDATE; -- 행 잠금
IF v_balance < p_amount THEN
RAISE EXCEPTION '잔액 부족: 현재 잔액 %', v_balance;
END IF;
-- 출금
UPDATE accounts SET balance = balance - p_amount
WHERE id = p_from_account;
-- 입금
UPDATE accounts SET balance = balance + p_amount
WHERE id = p_to_account;
-- 거래 기록
INSERT INTO transactions (from_id, to_id, amount, created_at)
VALUES (p_from_account, p_to_account, p_amount, NOW());
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
$$;
-- 호출
CALL transfer_money(101, 202, 50000);
함수 vs 프로시저
| 항목 | 함수 (Function) | 프로시저 (Procedure) |
|---|
| 반환값 | 반드시 반환 | 반환 없음 또는 OUT 파라미터 |
| 트랜잭션 | 제어 불가 | COMMIT/ROLLBACK 가능 |
| 호출 방법 | SELECT 내 사용 가능 | CALL 문 사용 |
| 용도 | 계산, 변환 | 데이터 처리, 비즈니스 로직 |
장단점
| 장점 | 단점 |
|---|
| 네트워크 왕복 감소 | DB 서버 부하 증가 |
| 파싱 오버헤드 감소 | 버전 관리 어려움 |
| 보안 (직접 테이블 접근 차단) | 디버깅 어려움 |
| 코드 재사용 | DB 종속성 (이식성 낮음) |
관련 개념