Youn's IT Memo
SQL 트리거 - Log 설계 본문
Summary
최근 게시판 작업을 진행하면서 로그를 남기는 여러가지 방법을 찾던 와중에 트리거를 발견하게 되었습니다.
기존에 트리거를 실무에선 잘 못본 것 같아서 이번에 구현해보고 실습해보았습니다.
트리거 사용 전 사전 설계
트리거를 이용해 주문 입력시 물품의 재고개수를 하나 줄이고 로그를 추가해보는 로직을 구상하였습니다.
제작하기 전에 사용할 간단한 DB테이블 설계를 진행하였습니다.

주문과 물품이 1:1로 연결되어 있고 로그는 따로 설정되어 있는 DB 로직입니다.
데이터베이스는 MySql 로 진행하였습니다.
테이블 생성
위에 설계된 주문 물품에 대한 테이블을 생성하였습니다
create table `order` (
id serial primary key ,
product_id bigint,
name varchar(255) not null ,
create_at datetime not null
);
create table `product` (
id serial primary key ,
name varchar(255) not null ,
stock int not null ,
create_at datetime not null
);
create table `order_log` (
id serial primary key ,
order_id bigint not null ,
status varchar(255) not null ,
create_at datetime not null
);
트리거 생성
주문 입력시 다음과 같은 로직을 수행하게 됩니다.
- 주문 입력시 주문에 포함된 주문 ID와 물품 ID를 분리합니다
- 물품 ID를 이용해 현재 재고를 하나 줄입니다
- 주문 ID를 포함한 정보를 주문 로그에 추가합니다
create trigger reduce_product_add_log
after insert
on `order` for each row
begin
# NEW - insert된 이후의 Order를 의미
# Update On시 업데이트 이후 Order를 의미
declare order_id bigint default NEW.id;
declare product_id bigint default NEW.product_id;
update product set stock = stock - 1 where product.id = product_id;
insert into order_log values (default, order_id, 'INSERT', now());
end;
실행 후 결과
물품의 경우 기본 재고를 100개로 설정하여 입력해두었습니다.



지극히 주관적인 생각
중간에 작성하면서 실무에서 선호하지 않는 이유를 알거 같았습니다.
- 일단 별도의 트리거가 생성되어 로직을 수행하기 때문에 파악하기 어려운 문제가 있을거 같습니다
- 추가로 트리거 로직에 대한 문서를 따로 정의하여 관리를 해주어야 할것 같습니다.
- 트리거가 여러개 존재한다면 트리거 간의 로직이 체이닝 되면서 문제가 발생합니다.
'데이터베이스' 카테고리의 다른 글
| 레거시 프로젝트 DB 동기화 문: Oracle Docker Image를 활용한 프로세스 (0) | 2024.04.06 |
|---|