컴퓨터 과학/데이터 베이스

MySQL 트리거: BEFORE vs AFTER

Data Jun 2025. 8. 23. 16:45

MySQL의 **트리거(Trigger)**는 특정 테이블에서 INSERT, UPDATE, DELETE 같은 DML 문이 실행될 때 자동으로 실행되는 객체입니다.

트리거는 실행 시점에 따라 BEFOREAFTER로 나눌 수 있습니다.

BEFORE 트리거

  • DML 문이 실행되기 “직전”에 동작합니다.
  • 실제 데이터가 테이블에 반영되기 전에 실행되므로,
    👉 데이터 **검증(Validation)**이나 **값 변환(Transformation)**에 자주 사용됩니다.

예시

CREATE TRIGGER beforeUserInsert
BEFORE INSERT ON userTbl
FOR EACH ROW
BEGIN
    -- 나이가 NULL이면 기본값 0으로 설정
    IF NEW.age IS NULL THEN
        SET NEW.age = 0;
    END IF;
END;

INSERT가 실행되기 전에 NEW.age 값을 조정.

 

AFTER 트리거

  • DML 문이 실행된 “직후”에 동작합니다.
  • 실제 데이터가 테이블에 반영된 이후 실행되므로,
    👉 로그 기록, 다른 테이블 업데이트, 통계 반영 등에 주로 사용됩니다.

예시

CREATE TRIGGER afterOrderInsert
AFTER INSERT ON orderTbl
FOR EACH ROW
BEGIN
    -- 주문이 들어오면 주문 로그 테이블에 기록
    INSERT INTO orderLog(userID, prodName, orderAmount)
    VALUES(NEW.userID, NEW.prodName, NEW.orderAmount);
END;

주문이 완료된 후, 주문 로그를 남김.

 

NEW / OLD 가상 테이블 개념

트리거 안에서는 실제 테이블 대신 가상 테이블을 참조합니다.

 

예시로 UPDATE 트리거를 보면:

CREATE TRIGGER beforeUserUpdate
BEFORE UPDATE ON userTbl
FOR EACH ROW
BEGIN
    -- 변경 전 값(OLD)과 변경 후 값(NEW) 비교
    IF OLD.age <> NEW.age THEN
        INSERT INTO userLog(userID, oldAge, newAge)
        VALUES(OLD.userID, OLD.age, NEW.age);
    END IF;
END;

여기서

  • OLD = 변경되기 전 값 (업데이트 전 데이터가 머무르는 가상 테이블)
  • NEW = 변경된 후 값 (업데이트 후 반영될 데이터가 머무르는 가상 테이블)

마찬가지로 DELETE 트리거에서는 삭제되기 전 데이터가 OLD에 담겨 있어, 삭제된 값을 로그로 남길 수 있습니다.

 

비교 정리

 

정리

  • BEFORE 트리거 → 데이터가 저장되기 전에 값 검증/수정
  • AFTER 트리거 → 데이터가 저장된 후 로그/연관 테이블 작업

👉 한마디로,

  • BEFORE = 예방(Validation)
  • AFTER = 후처리(Post-processing)

 

결론:
트리거를 사용할 때는 **“이 로직이 데이터 저장 전 검증인지, 저장 후 후처리인지”**를 기준으로 BEFORE와 AFTER를 나눠 사용하면 됩니다.