โ ์ง์ฐ๋๋ ํ๋ก์ ํธ์ ์ธ๋ ฅ์ ๋ ํฌ์ ํ๋ฉด ์คํ๋ ค ๋ ๋ฆ์ด์ง๋ค. โ
- Frederick Philips Brooks
Mythical Man-Month ์ ์

Trigger (ํธ๋ฆฌ๊ฑฐ)
ํธ๋ฆฌ๊ฑฐ(Trigger)๋ ์ฌ์ ์ ์๋ฏธ๋ก '๋ฐฉ์์ '๋ผ๋ ๋ป์ด๋ค.
MySQL์์ ํธ๋ฆฌ๊ฑฐ๋ ํ ์ด๋ธ์์ ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ์คํ๋๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ์ด๋ค ํ ์ด๋ธ์์ ํน์ ํ ์ด๋ฒคํธ(update, insert, delete)๊ฐ ๋ฐ์ํ์ ๋, ์คํ์ํค๊ณ ์ ํ๋ ์ถ๊ฐ ์ฟผ๋ฆฌ ์์ ๋ค์ ์๋์ผ๋ก ์ํํ ์ ์๊ฒ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด ๋๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ๊ณ ๊ฐ์ด ๋ฌผ๊ฑด์ ๊ตฌ๋งคํด ๊ตฌ๋งค ํ ์ด๋ธ์ ์ ๋ณด๊ฐ insert๋๋ฉด, ๋ฑ๋ก๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ๋ํด ๋ฌผํ ํ ์ด๋ธ์ ์๋์ผ๋ก update ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ฒ ํ๊ณ , ๋ ๋ฑ๋ก๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ๋ํด ๋ฐฐ์กํ ์ด๋ธ์ insert ์ฟผ๋ฆฌ๋ฌธ์ ์คํ์ํค๊ฒ ๋ ํ ์ ์๋ค.

- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ(Database Trigger)๋ ํ ์ด๋ธ์ ๋ํ ์ด๋ฒคํธ์ ๋ฐ์ํด ์๋์ผ๋ก ์คํ๋๋ ์์ ์ ์๋ฏธ
- โํ ์ด๋ธ์ DML๋ฌธ(Insert, Update, Delete ๋ฑ) ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋ ์๋
- ํ ์ด๋ธ์ ๋ถ์ฐฉ๋๋ ํ๋ก๊ทธ๋จ ์ฝ๋
- ์๊ธฐ๊ฐ ์ง์ ์คํ ๋ถ๊ฐ. ํ ์ด๋ธ์ ์ด๋ฒคํธ ์ผ์ด๋์ผ ์๋ ์คํ
- IN, OUT ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์
- MySQL์ View์ ํธ๋ฆฌ๊ฑฐ ๋ถ์ฐฉ ๋ถ๊ฐ
ํธ๋ฆฌ๊ฑฐ ์ข ๋ฅ

ํ ํธ๋ฆฌ๊ฑฐ
- ํ ์ด๋ธ ์์ ์ํฅ์ ๋ฐ์ ํ ๊ฐ๊ฐ์ ๋ํด ์คํ๋๋ค.
- ๋ณ๊ฒฝ ์ ๋๋ ๋ณ๊ฒฝ ํ์ ํ์ OLD, NEW๋ผ๋ ๊ฐ์ ์ค ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ ์ ์๋ค
- old - ์์ ๋ฐ์ดํฐ ์ฆ, delete ๋ก ์ญ์ ๋ ๋ฐ์ดํฐ ๋๋ update ๋ก ๋ฐ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ
- new - ์ ๋ฐ์ดํฐ ์ฆ, insert ๋ก ์ฝ์ ๋ ๋ฐ์ดํฐ ๋๋ update ๋ก ๋ฐ๋ ํ์ ๋ฐ์ดํฐ
- old - ์์ ๋ฐ์ดํฐ ์ฆ, delete ๋ก ์ญ์ ๋ ๋ฐ์ดํฐ ๋๋ update ๋ก ๋ฐ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ
ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ | OLD | NEW |
INSERT | X | O |
UPDATE | O | O |
DELETE | O | X |
* update์ผ ๊ฒฝ์ฐ, ๊ธฐ์กด์ ๋ฐ์ดํฐ(old)๋ฅผ ์๋ก์ด๋ฐ์ดํฐ๋ก(new)๋ก ๊ต์ฒดํ๋ ๊ฑฐ๋๊น old, new ๋๋ค ์ธ ์ ์๋ค.
* ํ์ง๋ง delete์ผ๊ฒฝ์ฐ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฑฐ๋ new๋ฅผ ์ธ์ํ ์๊ฐ ์๋ค.
* insert์ญ์ ์๋ก ์ฝ์ ํ๋๊ฑฐ๋ old๊ฐ ์์๋ฆฌ ์๋ค.
๋ฌธ์ฅ ํธ๋ฆฌ๊ฑฐ
- INSERT, UPDATE, DELETE ๋ฌธ์ ๋ํด ํ๋ฒ๋ง ์คํ๋๋ค
- ์ฝ์ , ๊ฐฑ์ ๋๋ ์ญ์ ๋๋ ํ ์์ ๊ด๊ณ์์ด ๊ฐ ํธ๋์ญ์ ์ ๋ํด ๋ช ๋ น๋ฌธ ๋ ๋ฒจ ํธ๋ฆฌ๊ฑฐ๊ฐ ํ ๋ฒ ์คํ๋๋ค.
BEFORE ๋๋ AFTER : ํธ๋ฆฌ๊ฑฐ๊ฐ ์คํ๋๋ ์๊ธฐ๋ฅผ ์ง์ ํ๋ค.
- after ํธ๋ฆฌ๊ฑฐ : ์ฟผ๋ฆฌ ์ด๋ฒคํธ ์๋ํ๊ธฐ ํ
- before ํธ๋ฆฌ๊ฑฐ : ์ฟผ๋ฆฌ ์ด๋ฒคํธ ์๋ํ๊ธฐ ์ ์ -> ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธ ๊ฐ๋ฅ!

INSTEAD OF : ํธ๋ฆฌ๊ฑฐ๋ฅผ ์๋ ๋ฌธ์ฅ ๋์ ์ํํ๋ค.

ํธ๋ฆฌ๊ฑฐ ์ฌ์ฉ๋ฒ
ํธ๋ฆฌ๊ฑฐ ์์ฑ
DELIMITER $$
CREATE TRIGGER update_item
AFTER UPDATE -- {BEFORE | AFTER} {INSERT | UPDATE| DELETE } ์ค ์ธ์ ์ด๋ค ์์
์ ํ ์ง ์ ํ๋ค
ON sale_table -- ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ถ์ฐฉํ ํ
์ด๋ธ
FOR EACH ROW -- ์๋ ๋์ฌ ์กฐ๊ฑด์ ํด๋นํ๋ ๋ชจ๋ row์ ์ ์ฉํ๋ค๋ ๋ป
BEGIN
-- ํธ๋ฆฌ๊ฑฐ์ ์คํ๋๋ ์ฝ๋
IF NEW.discount_rate != OLD.discount_rate THEN -- update ํธ๋ฆฌ๊ฑฐ๋ old์ new ๊ฐ์ด ์กด์ฌํ๋ค.
UPDATE item_table SET discount_rate = NEW.discount_rate WHERE discount_rate = OLD.discount_rate;
END IF;
END $$
DELIMITER ;
BEGIN~END ์ฌ์ด์ ์กฐ๊ฑด๋ฌธ๊ณผ ์คํ๋ฌธ์ ์์ฑํ๋ค.
sale_table ํ ์ด๋ธ์ ๋ณ๊ฒฝ ์ /ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์์ ๋ณ๊ฒฝ ์ ์ OLD, ๋ณ๊ฒฝ ํ๋ NEW ํค์๋๊ฐ ๋ถ๋๋ค
๋ฐ๋ผ์ IF NEW.discount_rate != OLD.discount_rate THEN์ ์๋ฏธ๋,
sale_table์ AFTER UPDATE ํ discount_rate ํ๋์ ๊ฐ๊ณผ ๋ณ๊ฒฝ ์ discount_rate ํ๋์ ๊ฐ์ด ๋ถ์ผ์นํ๋ค๋ ์กฐ๊ฑด์ ์๋ฏธํ๋ค.
์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ row๋ IF๋ฌธ ์๋ ์์ฑ๋ UPDATE ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ฒ ๋๋ค.
โ
ํธ๋ฆฌ๊ฑฐ ์คํ
TRIGGER update_item ์ AFTER UPDATE ON sale_table ์ด ์คํ๋๋ฉด ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ํ๋ ๊ตฌ์กฐ๋ผ, ๋น์ฐํ sale_table์ update์ฟผ๋ฆฌ๋ฅผ ์ฃผ๋ฉด ๋๋ค.
UPDATE sale_table SET ... WHERE ...;
ํธ๋ฆฌ๊ฑฐ ํ์ธ
show triggers;

โ
ํธ๋ฆฌ๊ฑฐ ์ญ์
DELETE TRIGGERS;
ํธ๋ฆฌ๊ฑฐ vs ํ๋ก์์
- ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ(INSERT | UPDATE | DELETE)๊ฐ ์คํ๋ ํ
์ด๋ธ์, ํธ๋ฆฌ๊ฑฐ๋ฅผ ํตํด ์์ ํ๋ ค ํ๋ฉด ์๋ฌ ๋ฐ์
- ์๋ฅผ ๋ค์ด A ํ ์ด๋ธ์ INSERT ํธ๋ฆฌ๊ฑฐ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ํธ๋ฆฌ๊ฑฐ ์ฒ๋ฆฌ์์ Aํ ์ด๋ธ์ UPDATE๋ฅผ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ํธ๋ฆฌ๊ฑฐ ํ ์ด๋ธ์ ์์ ํ๋ ค๋ฉด ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ํ๋ก์์ ๋ก ์ฒ๋ฆฌํด์ผํจ
- ํธ๋ฆฌ๊ฑฐ๋ ๋งค ์ด๋ฒคํธ(INSERT | UPDATE | DELETE)๋ง๋ค ๋์ผํ๊ฒ ์ฒ๋ฆฌํ์ฌ ์ ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ณ ํ๋ก์์ ๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค
- ์๋ฅผ ๋ค์ด ํต์ ์ฌ๊ฐ ํ์ ๋ฑ๊ธ์ ๊ฒฐ์ ํ ๋ ์ ๋ ๋ ์ฌ์ฉ ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํ์ ๋ฑ๊ธ์ ๊ฒฐ์ ํ๋ ์ฒ๋ฆฌ๋ฅผ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ ํ๋ก์์ ๋ก ํด์ผํ๋ค.
โ
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.