Notice
Recent Posts
Recent Comments
Link
GitHub Contribution 그래프
Loading data ...
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Youn's IT Memo

SQL 트리거 - Log 설계 본문

데이터베이스

SQL 트리거 - Log 설계

bellman66 2023. 9. 9. 14:29

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개로 설정하여 입력해두었습니다.

 


지극히 주관적인 생각

중간에 작성하면서 실무에서 선호하지 않는 이유를 알거 같았습니다.

  • 일단 별도의 트리거가 생성되어 로직을 수행하기 때문에 파악하기 어려운 문제가 있을거 같습니다
  • 추가로 트리거 로직에 대한 문서를 따로 정의하여 관리를 해주어야 할것 같습니다.
  • 트리거가 여러개 존재한다면 트리거 간의 로직이 체이닝 되면서 문제가 발생합니다.