MySQL의 SIGNAL 문은 예상치 못한 상황을 처리하고, 필요에 따라 애플리케이션을 안전하게 종료할 수 있도록 돕는 오류 처리 메커니즘입니다. 기본적으로 SIGNAL 문은 오류 핸들러(handler)에게 오류 정보를 전달하는 역할을 합니다.
SIGNAL 문의 기본 구문
SIGNAL SQLSTATE | condition_value
[SET signal_information_item = value_1[, signal_information_item = value_2, ...]];
여기서 SIGNAL 키워드 뒤에는 SQLSTATE 값 또는 DECLARE CONDITION 문으로 선언된 조건 이름(condition name)이 옵니다. SIGNAL 문은 반드시 SQLSTATE 값 또는 SQLSTATE 값으로 정의된 이름 있는 조건을 지정해야 합니다.
SQLSTATE 값 규칙
- SIGNAL 문의 SQLSTATE 값은 5자리 영숫자(alphanumeric) 코드로 구성됩니다.
- 사용자가 직접 정의하는 SQLSTATE 코드는 '00'으로 시작하면 안 됩니다. '00'으로 시작하는 값은 성공(success)을 의미하므로 오류 신호로는 유효하지 않습니다.
- 유효하지 않은 SQLSTATE 값을 지정하면 Bad SQLSTATE 오류가 발생합니다.
- 모든 오류를 포괄적으로 처리(catch-all)하려면 '45000' 값을 사용하는 것이 좋습니다. 이 값은 "처리되지 않은 사용자 정의 예외(unhandled user-defined exception)"를 의미합니다.
트리거와 함께 SIGNAL 문 사용 예제
다음 예제는 MySQL 트리거에서 SIGNAL 문을 실제로 활용하는 방법을 보여줍니다. student_age 테이블에 BEFORE INSERT 트리거를 생성하여, 나이(age)가 0보다 작은 값을 입력하려고 할 때 SIGNAL 문으로 오류 메시지를 발생시킵니다.
mysql> CREATE TRIGGER before_insert_studentage BEFORE INSERT ON
student_age FOR EACH ROW BEGIN IF NEW.age < 0 THEN SIGNAL SQLSTATE
'45000' SET MESSAGE_TEXT = 'age less than 0'; END IF; END; //
Query OK, 0 rows affected (0.12 sec)
mysql> INSERT INTO student_age(age, name) VALUES(-10, 'gaurav');//
ERROR 1644 (45000): age less than 0
위 실행 결과에서 확인할 수 있듯이, 나이가 0보다 작은 데이터를 삽입하려고 시도하면 트리거가 동작하여 SIGNAL 문을 통해 ERROR 1644 (45000): age less than 0라는 오류가 발생하며 잘못된 데이터의 입력이 차단됩니다.
이처럼 SIGNAL 문을 트리거와 함께 사용하면 애플리케이션 수준이 아닌 데이터베이스 수준에서 데이터 무결성을 강화할 수 있습니다. 특정 비즈니스 규칙(예: 음수 나이 금지, 필수 값 누락 방지 등)을 위반하는 데이터가 저장되기 전에 즉시 오류를 반환하므로, 더욱 견고하고 안정적인 시스템을 구축할 수 있습니다.