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

김상욱·2024년 12월 14일

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

트리거(Trigger)는 데이터베이스 관리 시스템(DBMS)에서 특정한 이벤트가 발생할 떄 자동으로 실행되는 일종의 저장된 프로시저 또는 코드 블록. 트리거는 데이터의 무결성을 유지하고, 비즈니스 로직을 자동화하며 데이터베이스 작업을 감시하는 데 유용하게 사용. 트리거는 주로 INSERT, UPDATE, DELETE와 같은 데이터 조작 언어(DML) 명령이 실행될 때 동작, 데이터베이스 상태 변경에 반응하여 특정 작업 수행.

  • 트리거는 사용자의 명시적인 호출 없이도 데이터베이스 이벤트에 반응하여 자동으로 실행.
  • 트리거를 사용하여 데이터 입력 시 자동으로 유효성 검사를 수행하거나 참조 무결성을 유지할 수 있음.
  • 애플리케이션 레이어 대신 데이터베이스 레이어에서 비즈니스 로직을 구현함으로써 일관성을 유지할 수 있음
  • 데이터 변경 내역을 자동으로 기록하여 감사 로그를 생성할 수 있음.

but

  • 트리거가 많아지면 데이터베이스의 복잡성이 증가하고 관리가 어려워질 수 있음.
  • 트리거가 복잡하거나 빈번하게 실행되면 데이터베이스 성능에 영향을 미침.
  • 트리거 내에서 발생하는 오류를 추적하고 수정하는 것이 어려울 수 있음.

so

  • 모든 작업을 트리거로 처리하는 것은 바람직하지 않으므로 필요성 검토 필요
  • 트리거가 데이터베이스 성능에 미치는 영향을 고려하고 최적화된 코드 작성 필요
  • 트리거의 동작과 목적을 명확히 문서화하여 유지보수 용이하게 해야함.
  • 트리거를 구현한 후에는 다양한 시나리오에서 철저한 테스트를 수행하여 예상치 못한 동작을 방지.

트리거의 종류

실행 시점 기준
  • Before 트리거 : 지정된 이벤트가 발생하기 전에 실행. 예를 들어, INSERT 트리거나 BEFORE로 설정되면 데이터가 실제로 테이블에 삽입되기 전에 트리거가 실행
  • AFTER 트리거 : 지정된 이벤트가 발생한 후에 실행됨.
  • INSTEAD OF 트리거 : 지정된 이벤트 대신에 실행. 주로 뷰에 사용되며 뷰에 대한 INSERT, UPDATE, DELETE 작업을 직접 처리할 때 사용.
이벤트 유형에 따른 분류
  • DML 트리거 : INSERT, UPDATE, DELETE와 같은 데이터 조작 이벤트에 반응
  • DDL 트리거 : CREATE, ALTER, DROP과 같은 데이터 정의 언어 이벤트에 반응
  • 로그온/로그오프 트리거 : 사용자가 데이터베이스에 로그인하거나 로그오프할 때 실행

트리거 사용 예시

  • 데이터 무결성 유지 : 직업 테이블에 새로운 직원이 추가될 때마다 직원의 나이가 18세 이상인지 자동으로 확인하는 트리거를 생성
CREATE TRIGGER CheckEmployeeAge
BEFORE INSERT ON Employees
FOR EACH ROW
BEGIN
    IF NEW.age < 18 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '직원의 나이는 18세 이상이어야 합니다.';
    END IF;
END;
  • 자동 로그 기록 : 데이터 변경 내역을 별도의 로그 테이블에 자동으로 기록하는 트리거 생성
CREATE TRIGGER LogEmployeeChanges
AFTER UPDATE ON Employees
FOR EACH ROW
BEGIN
    INSERT INTO Employees_Log (employee_id, old_salary, new_salary, change_date)
    VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END;
  • 집계 값 자동 갱신 : 주문 테이블에서 새로운 주문이 추가될 때마다 고객의 총 주문 금액을 자동으로 갱신하는 트리거
CREATE TRIGGER UpdateCustomerTotal
AFTER INSERT ON Orders
FOR EACH ROW
BEGIN
    UPDATE Customers
    SET total_order_amount = total_order_amount + NEW.order_amount
    WHERE Customers.id = NEW.customer_id;
END;

신입 및 취업 준비생 Java와 Spring 백엔드 개발자 입장에서 트리거와 관련된 실습을 진행하려면 다음과 같은 프로젝트 또는 실습 과제를 수행할 수 있습니다. 이는 트리거의 개념을 이해하고 데이터베이스와 백엔드의 연동을 경험하는 데 도움이 됩니다.


1. 트리거를 활용한 실시간 로그 기록

목표: 사용자의 데이터 변경 내역을 자동으로 기록하는 시스템을 구현합니다.

실습 계획:
1. DB 설계:

  • 두 개의 테이블 생성:
    • Users 테이블 (사용자 정보 저장).
    • Users_Log 테이블 (변경 내역 저장).
  • Users 테이블: id, name, email 등의 컬럼 포함.
  • Users_Log 테이블: log_id, user_id, change_type, old_value, new_value, change_date 컬럼 포함.
  1. 트리거 작성:

    • AFTER INSERT, AFTER UPDATE 트리거를 작성하여 Users_Log 테이블에 변경 사항 기록.
    CREATE TRIGGER LogUserChanges
    AFTER UPDATE ON Users
    FOR EACH ROW
    BEGIN
        INSERT INTO Users_Log (user_id, change_type, old_value, new_value, change_date)
        VALUES (OLD.id, 'UPDATE', OLD.name, NEW.name, NOW());
    END;
  2. Spring 연동:

    • Spring 프로젝트를 생성하고 JPA/Hibernate를 사용하여 UsersUsers_Log 테이블과 매핑.
    • REST API를 구현하여 사용자 정보를 업데이트하거나 삽입.
  3. 테스트:

    • Postman 또는 Swagger를 통해 API를 호출해 보고 트리거가 정상적으로 작동하여 로그가 기록되는지 확인.

2. 트리거로 비즈니스 로직 자동화

목표: 주문(Order)이 생성되면 고객(Customer)의 총 주문 금액(total_order_amount)을 자동 갱신.

실습 계획:
1. DB 설계:

  • Customers 테이블: id, name, total_order_amount.
  • Orders 테이블: order_id, customer_id, order_amount, order_date.
  1. 트리거 작성:

    • 주문이 삽입될 때 Customers 테이블의 total_order_amount를 업데이트하는 트리거 작성.
    CREATE TRIGGER UpdateCustomerTotal
    AFTER INSERT ON Orders
    FOR EACH ROW
    BEGIN
        UPDATE Customers
        SET total_order_amount = total_order_amount + NEW.order_amount
        WHERE id = NEW.customer_id;
    END;
  2. Spring 연동:

    • Spring Data JPA를 사용하여 CustomerOrder 엔티티를 작성.
    • 주문 생성 API 구현.
    • API 호출 후 Customers 테이블의 total_order_amount가 자동으로 업데이트되는지 확인.
  3. 테스트:

    • 주문 생성 API를 호출하고 결과를 확인.

3. 트리거를 활용한 비정상 데이터 차단

목표: 입력된 데이터가 비즈니스 규칙을 위반하면 트리거로 차단.

실습 계획:
1. DB 설계:

  • Employees 테이블: id, name, age, position.
  1. 트리거 작성:

    • 직원 나이가 18세 미만이면 데이터를 삽입하지 못하도록 트리거 작성.
    CREATE TRIGGER PreventUnderageEmployee
    BEFORE INSERT ON Employees
    FOR EACH ROW
    BEGIN
        IF NEW.age < 18 THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = '직원의 나이는 18세 이상이어야 합니다.';
        END IF;
    END;
  2. Spring 연동:

    • Spring에서 직원 데이터를 삽입하는 API 구현.
    • 트리거에서 발생한 예외를 캐치하여 사용자에게 적절한 메시지를 반환하도록 설계.
  3. 테스트:

    • 18세 미만의 데이터를 삽입하려고 시도하고 예외 메시지가 반환되는지 확인.

4. 실시간 알림 시스템

목표: 특정 테이블의 데이터가 변경되면 실시간 알림을 전송.

실습 계획:
1. DB 설계:

  • Notifications 테이블: notification_id, message, created_at.
  1. 트리거 작성:

    • 데이터가 삽입될 때 알림 메시지를 생성.
    CREATE TRIGGER NotifyOnNewOrder
    AFTER INSERT ON Orders
    FOR EACH ROW
    BEGIN
        INSERT INTO Notifications (message, created_at)
        VALUES (CONCAT('새로운 주문이 추가되었습니다. 주문 ID: ', NEW.order_id), NOW());
    END;
  2. Spring 연동:

    • Notifications 테이블의 변경 사항을 감지하는 API 작성.
    • WebSocket을 사용하여 알림을 실시간으로 전송.
  3. 테스트:

    • 주문을 생성한 후 알림 메시지가 WebSocket을 통해 클라이언트로 전송되는지 확인.

5. 실시간 트리거 모니터링 대시보드

목표: 트리거 실행 내역을 기록하고, Spring으로 대시보드를 만들어 실시간으로 확인.

실습 계획:
1. DB 설계:

  • Trigger_Log 테이블: log_id, trigger_name, action_time, details.
  1. 트리거 작성:

    • 모든 트리거의 실행 내역을 Trigger_Log 테이블에 기록.
    CREATE TRIGGER LogTriggerExecution
    AFTER INSERT ON Orders
    FOR EACH ROW
    BEGIN
        INSERT INTO Trigger_Log (trigger_name, action_time, details)
        VALUES ('LogTriggerExecution', NOW(), 'Orders 테이블에 새로운 데이터 삽입');
    END;
  2. Spring 연동:

    • Trigger_Log 엔티티를 생성하고, 대시보드 API 구현.
    • Spring Boot와 Thymeleaf를 사용해 트리거 실행 내역을 보여주는 대시보드 페이지 생성.
  3. 테스트:

    • 여러 이벤트를 발생시킨 후, 대시보드에서 기록된 트리거 실행 내역을 확인.

추가 실습 팁

  • Docker 활용: MySQL Docker 컨테이너를 사용해 쉽게 데이터베이스 환경을 설정.
  • 예외 처리 학습: Spring에서 데이터베이스 트리거로 발생한 에러를 처리하는 방법 연구.
  • 확장성 고려: 실습 결과를 점차 복잡한 비즈니스 로직으로 확장해보세요.

이러한 실습을 통해 데이터베이스 트리거의 개념을 이해하고, Java와 Spring 백엔드와 연동하는 경험을 쌓을 수 있습니다. 실습 후 결과를 블로그나 포트폴리오로 정리하면 취업 준비에도 유용할 것입니다.

0개의 댓글