SQL에서는 특정 작업을 자동화하거나 반복적인 연산을 효율적으로 처리하기 위해 **Procedure(프로시저)**와 **Trigger(트리거)**를 제공합니다. 이 글에서는 두 개념의 차이점과 특징을 정리하고, 언제 어떤 것을 사용하는 것이 적합한지 비교합니다.
1. Stored Procedure (저장 프로시저)
개념
Procedure는 SQL 문장을 하나의 단위로 묶어 저장한 사용자 정의 프로그램입니다. 사용자가 명시적으로 호출하여 실행해야 하며, 복잡한 로직을 캡슐화할 수 있습니다.
작동 방식
CREATE PROCEDURE procedure_name()
BEGIN
END;
CALL procedure_name();
특징
- 명시적으로 호출해야 실행됨 (
CALL, EXEC 등)
- 매개변수 전달 가능 (
IN, OUT, INOUT)
- 반복 작업, 트랜잭션 처리, 에러 핸들링 등 다양한 로직 가능
- 내부에서
COMMIT, ROLLBACK 등 트랜잭션 제어 가능
장단점
| 장점 | 단점 |
|---|
| 코드 재사용 가능 | 정의 및 관리가 별도로 필요함 |
| 복잡한 로직 캡슐화 가능 | 사용자 호출 없으면 실행되지 않음 |
| 트랜잭션 처리 등 고급 기능 지원 | 오용 시 복잡도 증가 |
2. Trigger (트리거)
개념
Trigger는 특정 테이블에서 INSERT, UPDATE, DELETE 이벤트가 발생할 때 자동 실행되는 객체입니다. 데이터 무결성 유지나 자동 감사(audit) 기능 등에 활용됩니다.
작동 방식
CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
BEGIN
END;
특징
- 자동 실행됨 (사용자가 직접 호출하지 않음)
- 특정 DML 이벤트(INSERT, UPDATE, DELETE)에 반응
- 트랜잭션 처리 제한 있음:
COMMIT, ROLLBACK 사용 불가
- 데이터 감사, 로깅, 무결성 검사 등에서 주로 사용
장단점
| 장점 | 단점 |
|---|
| 데이터 변경에 대해 자동 대응 가능 | 로직 흐름 파악이 어려울 수 있음 |
| 무결성 보장 및 감사 처리 가능 | 트랜잭션 제어 불가 (COMMIT 등 사용 불가) |
| 사용자 개입 없이 자동 실행 | 디버깅 및 테스트 어려움 |
비교 요약
| 항목 | Procedure | Trigger |
|---|
| 실행 방식 | 명시적 호출 (CALL, EXEC) | 이벤트 기반 자동 실행 (AFTER, BEFORE) |
| 주 용도 | 반복 업무 로직, 트랜잭션 처리 등 | 무결성 유지, 로깅, 데이터 추적 |
| 트랜잭션 제어 | 가능 (COMMIT, ROLLBACK) | 불가능 |
| 매개변수 | 사용 가능 (IN, OUT) | 사용 불가 |
| 호출 시점 | 개발자 혹은 사용자 호출 시점 | 지정된 이벤트 발생 시점 |
| 디버깅/관리 용이성 | 비교적 쉬움 | 상대적으로 어려움 |
사용 요약
| 상황 | 추천 객체 |
|---|
| 반복적으로 호출해야 하는 로직 처리 필요 | Procedure |
| 데이터 변경이 발생할 때 자동으로 처리해야 하는 로직 존재 | Trigger |
트랜잭션 분기 처리(예: 중간에 ROLLBACK)가 필요한 경우 | Procedure |
| 로깅, 무결성 검사, 자동 감사 처리가 필요한 경우 | Trigger |
마무리
Procedure와 Trigger는 모두 SQL에서 로직을 저장하고 실행할 수 있는 강력한 도구입니다.
- 하지만 실행 방식과 목적, 제약 사항이 다르기 때문에, 상황에 맞게 선택하는 것이 중요합니다.
- 특히
Trigger는 자동 실행되며 COMMIT, ROLLBACK이 불가능하므로 트랜잭션 처리에는 적합하지 않습니다.
- 반면
Procedure는 명시적 호출이 필요하지만 훨씬 유연하고 복잡한 작업이 가능합니다.