트리거(Trigger)란 무엇인가?

이성혁·2024년 8월 30일

Database

목록 보기
12/24
post-thumbnail

1. 트리거란 무엇인가?

사전적 의미에서 트리거는 "방아쇠"를 의미하며, 어떤 사건을 유발하는 계기나 작동을 촉발시키는 것을 의미합니다. SQL에서 트리거는 데이터베이스에서 특정 이벤트가 발생했을 때 자동으로 실행되는 프로시저를 말합니다. 다시 말해, 데이터가 변경되었을 때(예: INSERT, UPDATE, DELETE), 이 변경을 계기로 자동으로 실행되는 것이 바로 트리거입니다.


2. 트리거의 예제

사용자의 닉네임 변경 이력을 저장하는 트리거를 작성해 보겠습니다.

1) 시나리오

  • users 테이블에는 사용자 아이디와 닉네임이 저장됩니다.
  • user_logs 테이블에는 사용자가 이전에 사용했던 닉네임 이력이 저장됩니다.

2) 요구사항

  • 사용자가 닉네임을 변경할 때마다, 변경 이전의 닉네임을 user_logs 테이블에 자동으로 저장하고, 새로운 닉네임으로 업데이트해야 합니다.

3) 트리거 생성

CREATE TRIGGER before_nickname_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
  INSERT INTO user_logs (user_id, old_nickname, changed_at)
  VALUES (OLD.user_id, OLD.nickname, NOW());
END;

4) 동작 확인

닉네임을 'CodeMaster'에서 'NewCode'로 업데이트하면, 트리거가 실행되어 user_logs 테이블에 'CodeMaster'가 저장되고, users 테이블에는 'NewCode'로 업데이트됩니다.


3. 트리거의 활용 예시

다음은 사용자가 마트에서 상품을 구매할 때마다 누적된 구매 비용을 계산해 업데이트하는 트리거입니다.

1) 시나리오

  • purchases 테이블에는 사용자가 구매한 내역이 저장됩니다.
  • user_stats 테이블에는 사용자의 누적 구매 비용이 저장됩니다.

2) 트리거 생성

CREATE TRIGGER after_purchase_insert
AFTER INSERT ON purchases
FOR EACH ROW
BEGIN
  DECLARE total INT;
  DECLARE user_id INT DEFAULT NEW.user_id;

  SELECT SUM(amount) INTO total
  FROM purchases
  WHERE user_id = NEW.user_id;

  UPDATE user_stats
  SET total_spent = total
  WHERE user_id = NEW.user_id;
END;

3) 동작 확인

사용자가 5,000원을 구매하면, user_stats 테이블에 누적 구매 비용이 5,000원으로 업데이트됩니다. 이후 15,000원을 추가로 구매하면, 누적 구매 비용이 20,000원으로 업데이트됩니다.


4. 트리거 사용 시 주의사항

트리거는 편리한 기능이지만, 사용 시 주의해야 할 점이 많습니다:

  • 소스 코드에서 보이지 않는 로직: 트리거는 SQL 쿼리나 코드에서 명시적으로 호출되지 않기 때문에, 어떤 로직이 동작하는지 파악하기 어렵습니다. 이는 문제 발생 시 디버깅을 어렵게 만들 수 있습니다.
  • 복잡성 증가: 트리거가 여러 개 사용되면, 한 이벤트가 다른 트리거를 촉발시켜 연쇄적으로 동작하게 되어 시스템의 복잡도가 증가합니다. 이로 인해 유지 보수와 관리가 어려워질 수 있습니다.
  • 성능 문제: 트리거가 과도하게 사용되면, 데이터베이스에 부담을 주어 성능 저하를 초래할 수 있습니다. 특히, 여러 트리거가 연쇄적으로 실행되면, 응답 속도가 느려질 수 있습니다.
  • 디버깅의 어려움: 트리거는 자동으로 실행되기 때문에, 디버깅이 쉽지 않으며 문제가 발생했을 때 원인을 추적하기 어렵습니다.

5. 결론

트리거는 특정 상황에서 매우 유용한 도구지만, 사용에 신중을 기해야 합니다. 특히, 트리거를 사용할 때는 문서화가 중요하며, 관리와 유지 보수에 어려움이 없도록 최후의 수단으로 사용하는 것이 좋습니다.


출처

https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe

profile
항상 배우는 자세로 🪴

0개의 댓글