MySQL - 트리거: 초보자 가이드
안녕하세요, 데이터베이스 열정가 되고자 하는 여러분! 오늘 우리는 MySQL 트리거의 흥미로운 세상으로 뛰어들어 보겠습니다. 코드를 한 줄도 작성해 본 적이 없어도 걱정 마세요 - 이 여정에서 여러분의 친절한 안내자가 되어 step by step 설명해 드릴게요. 그럼 여러분의 좋아하는 음료를 한 잔 마시면서 시작해 보겠습니다!
트리거란 무엇인가요?
서점 도서관사원이 있다고 상상해 보세요. 매번 책이 빌려갈 때 별도의 로그를 업데이트해야 한다면 어떨까요? 이게 자동으로 되었으면 정말 좋겠죠? MySQL에서 트리거가 하는 일이 바로 이거예요 - 데이터베이스에서 특정 이벤트가 발생할 때 활동하는 유용한 작은 도서관사원들입니다.
기술적인 말로 트리거는 테이블과 연결된 이름이 있는 데이터베이스 객체로, 해당 테이블에서 특정 이벤트가 발생할 때 자동으로 활성화됩니다.
첫 번째 트리거
트리거가 어떻게 작동하는지 보기 위해 간단한 트리거를 만들어 보겠습니다. 우리는 books
테이블이 있고, 새로운 책이 추가될 때마다 로그를 남기고 싶다고 가정해 봅시다.
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);
CREATE TABLE book_log (
id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(50),
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
DELIMITER //
CREATE TRIGGER after_book_insert
AFTER INSERT ON books
FOR EACH ROW
BEGIN
INSERT INTO book_log (action) VALUES ('새로운 책 추가됨');
END //
DELIMITER ;
이를 해독해 보겠습니다:
- 우리는
books
와book_log
두 개의 테이블을 생성합니다. -
DELIMITER //
를 사용하여 디스크립토르를 일시적으로 변경하여 트리거 정의 내부에서 세미콜론을 사용할 수 있게 합니다. -
books
테이블에 삽입 작업이 이루어질 때 활성화되는after_book_insert
라는 트리거를 생성합니다. - 트리거는 책이 추가될 때마다
book_log
테이블에 새로운 행을 추가합니다.
이제 책을 추가할 때마다 자동으로 로그가 남깁니다!
MySQL에서 트리거의 종류
MySQL은 여러 종류의 트리거를 지원합니다. 이를 도서관사원들의 다른 시간대로 생각해 보세요:
1. BEFORE 트리거
실제 데이터베이스 작업 전에 실행되는 트리거입니다. 무언가가 일어나기 전에 최종 확인하는 것과 같습니다.
DELIMITER //
CREATE TRIGGER before_book_insert
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
IF NEW.title = '' THEN
SET NEW.title = '미제목';
END IF;
END //
DELIMITER ;
이 트리거는 책 제목이 비어 있으면 '미제목'으로 설정합니다.
2. AFTER 트리거
데이터베이스 작업 후에 실행되는 트리거입니다. 우리의 첫 번째 예제와 같습니다. 로그 작성이나 추가 작업에 유용합니다.
3. INSERT 트리거
삽입 작업에 특화된 트리거입니다. 우리의 첫 번째 두 가지 예제는 모두 INSERT 트리거였습니다.
4. UPDATE 트리거
행이 업데이트될 때 발생합니다. 하나 만들어 보겠습니다:
DELIMITER //
CREATE TRIGGER after_book_update
AFTER UPDATE ON books
FOR EACH ROW
BEGIN
INSERT INTO book_log (action)
VALUES (CONCAT('책 업데이트됨: ', OLD.title, '에서 ', NEW.title));
END //
DELIMITER ;
이 트리거는 책이 업데이트될 때 기존과 새로운 제목을 로그에 기록합니다.
5. DELETE 트리거
행이 삭제될 때 발생합니다. 예제를 보겠습니다:
DELIMITER //
CREATE TRIGGER before_book_delete
BEFORE DELETE ON books
FOR EACH ROW
BEGIN
INSERT INTO book_log (action)
VALUES (CONCAT('책 삭제됨: ', OLD.title));
END //
DELIMITER ;
이 트리거는 책이 삭제되기 전에 책 제목을 로그에 기록합니다.
트리거의 장점
- 자동화: 트리거는 작업을 자동화하여 수동 작업과 잠재적 오류를 줄입니다.
- 일관성: 트리거는 관련 작업이 항상 함께 발생하도록 보장합니다.
- 감사 기록: 트리거는 로그와 감사 기록을 유지하는 데 훌륭합니다.
- 비즈니스 규칙: 복잡한 비즈니스 규칙을 데이터베이스 수준에서 강제할 수 있습니다.
트리거의 단점
- 숨겨진 로직: 트리거는 애플리케이션의 전체 로직을 이해하는 데 어려움을 줄 수 있습니다.
- 성능 영향: 트리거의 과도한 사용은 데이터베이스 연산의 속도를 늦출 수 있습니다.
- 디버깅 어려움: 특히 복잡한 연산에서 트리거는 디버깅하기 어려울 수 있습니다.
- 유지보수: 데이터베이스가 커질수록 많은 트리거를 관리하는 것이 복잡해질 수 있습니다.
다음은 트리거 종류와 그 사용 목적을 요약한 표입니다:
트리거 종류 | 발생 시기 | 일반적인 사용 목적 |
---|---|---|
BEFORE INSERT | 새로운 행이 삽입되기 전 | 데이터 검증, 값 수정 |
AFTER INSERT | 새로운 행이 삽입된 후 | 로그 작성, 관련 테이블 업데이트 |
BEFORE UPDATE | 기존 행이 업데이트되기 전 | 데이터 검증, 값 수정 |
AFTER UPDATE | 기존 행이 업데이트된 후 | 로그 작성, 관련 테이블 업데이트 |
BEFORE DELETE | 기존 행이 삭제되기 전 | 로그 작성, 관련 테이블 업데이트 |
AFTER DELETE | 기존 행이 삭제된 후 | 정리 작업, 로그 작성 |
트리거는 요리의 향신료와 같아요 - 데이터베이스를 향상시키는 데 유용하지만 과도하게 사용하지 마세요!
결론적으로, 트리거는 MySQL에서 데이터베이스 기능과 일관성을 크게 향상시킬 수 있는 강력한 도구입니다. 트리거는 데이터를 지키는 충실한 보조자들입니다. MySQL을 계속 공부하면서 트리거를 실제 문제 해결에 창의적으로 사용하는 방법을 배울 것입니다.
미래의 데이터베이스 마법사 여러분, 즐겁게 트리거를 사용하세요!
Credits: Image by storyset