본문 바로가기
데이터베이스/탐구하기

트리거(TRIGGER)를 사용해도 될까?

by 유.독 2023. 8. 31.
반응형

안녕하세요 유.독입니다!

예전 프로젝트에서 히스토리테이블을 만들 때, 트리거를 쓰자는 의견이 있었습니다. 그런데 대부분 트리거를 달가워 하지 않는다며, 백앤드단에서 직접 구현하여 히스토리를 추가해주기를 요청하여, 요청대로 작업한 적이 있습니다. 그런데 왜 트리거를 달가워 하지 않았을까요? 그 의문에서 이 글은 시작되었습니다.

 

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

트리거는 데이터베이스 이벤트에 반응하여 실행되는 프로그램 단위입니다. 트리거의 주요 사용 목적은 테이블 데이터의 무결성 보장, 데이터베이스 관리의 자동화 등이라고 할 수 있습니다.

 

 


🙅‍♀️트리거를 사용하지 않는 이유

유지보수성

트리거를 사용하면 유지보수성이 떨어진다고 합니다. 소스 내에서는 트리거의 존재를 찾을 수 없고, 데이터베이스에서 직접 트리거를 찾아보아야만 트리거의 존재를 확인할 수 있습니다. 하지만 트리거가 존재한다는 것을 깨닫더라도, 트리거를 일일이 뒤져서 어떤 영향을 미칠지 파악을 해야만 하죠. 이처럼 소스와 분리되어 있기 때문에 로직을 파악하는 것이 어려워진다는 것이 단점입니다.


트랜잭션

그리고 트리거에서 예외가 발생하는 경우, 해당 트랜잭션이 롤백되는 것입니다. 예외가 발생해도 문제가 없는 경우나, 예외 발생시 별도의 처리가 필요하다면 트리거를 사용할 수 없습니다.


하나의 상황, 하나의 액션에 하나의 트리거!

CREATE TRIGGER INSERT_HISTORY
AFTER INSERT ON USER
FOR EACH ROW
INSERT INTO USER_HIS
SELECT USER.* FROM USER
WHERE USER_ID = NEW.USER_ID

트리거의 액션 종류는 INSERT, UPDATE, DELETE가 있습니다. 상황으로는 AFTER, BEFORE가 있는데, 이것을 조합하여 트리거를 발생시킬 수 있습니다. 예시문을 보면 USER 테이블에 AFTER INSERT 이벤트가 발생했을 경우, USER_HIS테이블에 모든 내용을 저장한다는 의미입니다. 이 예시는 매우 간단하지만, 만약 AFTER INSERT 이밴트 후에 할 작업이 여러개라면 트리거를 사용할 수 없습니다. 왜냐하면 한 번 이벤트와 상황을 조합하여 사용하면 해당 테이블에는 다른 트리거 사용이 불가능하기 때문입니다.


사용자 정보를 남길 수 없다.

해당 테이블에 액션이 일어날 때, 테이블에 변화를 일으킨 사용자의 정보를 저장해주지 않는다면 이 해당 액션이 누가 수행했는지를 알 수 있는 방법은 트리거로는 없습니다. 트리거로 히스토리 테이블에 데이터 쌓는 방법을 고민하다가 알게 된 내용입니다. 데이터 삭제시 실제 물리삭제를 하고(DELETE문 수행) 트리거를 발생시키면, 해당 테이블에 삭제한 유저의 정보를 업데이트 해주지 않는 이상, 삭제한 유저를 알 수 없다는 단점이 있습니다. INSERT, UPDATE시에는 등록자와 수정자 정보를 기본적으로 남기기 때문에 사용자 특정이 가능하지만, 물리 DELETE를 하는 경우에는 사용하기 어려울 것 같습니다.

 


🙆‍♂️트리거를 사용하면 좋은 점

데이터의 무결성 강화

어떤 테이블에서 변경이 일어났을 때, 다른 테이블에 변화를 꼭 야기해야하는 경우, 동일한 트랜잭션 내에서 수행이 되기 때문에 데이터의 무결성이 강화된다고 합니다.

집계 테이블에 활용 가능하다

실시간으로 통계 데이터를 확인해야 한다거나, 합계를 간단히 구하고 싶은 경우 등, 별도의 테이블에 집계정보를 저장한다면, 트리거는 아주 좋은 선택지입니다. 상품을 주문한 현황을 하고 싶다고 가정해봅시다. 상품의 주문량, 구매건수, 구매금액 등을 실시간으로 한 번에 한눈에 확인 하고 싶은 경우, 일반적으로 집계테이블을 사용합니다. 간단히 트리거를 사용하여 집계 테이블의 주문량 등의 정보를 업데이트 해줄 수 있습니다. 물론, 소스코드로 직접 업데이트 하는 것도 가능하죠!

여러곳에서 데이터베이스를 사용하는 경우

해당 데이터베이스를 여러 곳에서 사용하기 때문에, 히스토리 관리를 엄격하게 하고 싶다면 대안이 될 수 있습니다. 트리거는 테이블에 변경사항이 발생했을 때, 트리거가 발생합니다. 에디터를 사용하여 변경하는 경우에도 마찬가지입니다. 때문에 데이터의 변경을 엄격하게 감지하여 다른 테이블의 변화를 요구하는 경우 사용하기에 적합합니다.

 


마무리하며

프로그램의 유지보수성은 매우 중요합니다. 때문에 트리거를 사용하는 것보다 사용하지 않는 것이 오히려 프로그램을 관리성 측면에서는 좋다고 볼 수 있습니다. 이것이 트리거를 현업에서 잘 사용하지 않는 이유겠지요. 상황에 따라 다를 수 있으니 여러 조건들을 고려하여 판단하는 것이 필요할 것 같습니다.

 


Reference

 

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?pageid=4&mod=document&keyword=trigger&uid=237338 

 

트리거(Trigger)

트리거(Trigger) 활용 1. 데이터 무결성의 강화- 전체 데이터베이스에 걸쳐 영향 받은 테이블을 연속적으로 변경함으로서 데이터 무결성을 강화하는데 사용될 수 있다.- 중복되었거나 파생된 데이

dataonair.or.kr

↑ 트리거에 대한 설명

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?pageid=6&mod=document&keyword=trigger&uid=237577 

 

The Trouble with the Triggers-트리거 유지 보수 및 구현에 대한 가이드

The Trouble with the Triggers 트리거 유지 보수 및 구현에 대한 가이드 기술 인력들은 트리거 유지 보수 및 구현과 관련하여 어려운 과제에 직면 하고있다 asktom.oracle.com 웹 사이트를 자주 방문하는 분

dataonair.or.kr

↑ 트리거와 유지보수 관계성

https://mariadb.com/kb/en/trigger-overview/

 

Trigger Overview

Statements run when an event occurs on a table.

mariadb.com

↑ maria db 공식 설명

https://limkydev.tistory.com/154

 

[SQLD] 제2장 트리거(Trigger)란?

1. 트리거(Trigger)란? 트리거(Trigger)란 영어로 방아쇠라는 뜻인데, 방아쇠를 당기면 그로 인해 총기 내부에서 알아서 일련의 작업을 실행하고 총알이 날아갑니다. 이처럼 데이터베이스에서도 트리

limkydev.tistory.com

↑ 집계 테이블에 활용 가능함을 알려줌

https://velog.io/@hyunmoo0_0/%ED%8A%B8%EB%A6%AC%EA%B1%B0TRIGGER

 

오라클 트리거(TRIGGER)

트리거(TRIGGER)란 무엇인가?그 중에서도 오늘은 DML 트리거에 대해서 알아보려고 합니다.DML 트리거(TRIGGER)란?DML 트리거(TRIGGER)의 특징그럼 이제 DML 트리거 생성을 하는 방법에 대해서 알아 보도록

velog.io

↑ 트리거의 장단점

반응형