트리거(trigger) 는
"특정 이벤트가 발생했을 때 자동으로 실행되는 DB 프로그램" 이야.
쉽게 말하면:
누가 테이블에 INSERT, UPDATE, DELETE 하면
자동으로 뒤에서 숨어서 작동하는 감시자 코드!
📦 예시 비유
- 누군가 회원가입을 하면 → "자동으로 가입 로그 테이블에 기록"
- 누군가 상품을 삭제하면 → "자동으로 관련 재고도 삭제"
즉, 프로그래머가 직접 호출하지 않아도 DB가 알아서 호출함
🔧 Oracle 기준 트리거 기본 형태
CREATE OR REPLACE TRIGGER 트리거이름
AFTER INSERT OR UPDATE OR DELETE
ON 테이블명
FOR EACH ROW
BEGIN
-- 여기에 자동으로 실행할 SQL 코드 작성
INSERT INTO LOG_TABLE (내용) VALUES ('회원 정보 변경됨');
END;
💡 트리거 실행 시점 종류
| 키워드 | 의미 |
| BEFORE | INSERT/UPDATE/DELETE 되기 전에 실행 |
| AFTER | INSERT/UPDATE/DELETE 된 후 실행 |
| INSTEAD OF | 보통 뷰(View)에서 사용. 대신 실행됨 |
📌 언제 쓰면 좋을까?
| 상황 | 설명 |
| 데이터 변경 기록 | 로그 남기기 자동화 |
| 제약 조건 강제 | 특정 조건을 위반하면 에러 발생 |
| 자동 계산 | 가격 수정 시 자동 합계 계산 |
| 감시와 통제 | 민감 테이블에 무단 접근 추적 |
🚫 하지만 주의할 점
- 남용 금지: 너무 많이 만들면 성능 떨어짐
- 순서 충돌: 여러 트리거가 서로 영향을 줄 수 있음
- 디버깅 어려움: 자동으로 실행되니까 디버깅이 힘듦
❗ Java에서 비슷한 건 없나?
- Java에는 트리거 자체는 없지만,
- 이벤트 리스너 (ActionListener, MouseListener 등) 같은 개념이 유사한 역할을 해.
- 하지만 DB 수준에서 자동 실행되는 건 DB 트리거가 전담해.
✨ 요약
| 트리거란? | 데이터베이스에서 특정 이벤트(INSERT 등)가 발생하면 자동으로 실행되는 코드 | | 어디에 쓰나? | 로그, 감사, 데이터 보호, 자동 처리 | | Java에 있나? | ❌ Java 자체엔 없음. DB 전용 개념임 |
📚 트리거 예제 (회원가입 기록 남기기)
상황 가정:
- MEMBER 테이블에 회원 가입(insert) 이 일어날 때마다
- MEMBER_LOG 테이블에 "회원이 가입했다" 라는 기록을 자동으로 남기기
1. 테이블 먼저 만들기
-- 🧱 회원 테이블 만들기
CREATE TABLE MEMBER (
MEMBER_ID VARCHAR2(20), -- 회원 아이디
MEMBER_NAME VARCHAR2(50) -- 회원 이름
);
-- 📄 회원 가입 기록 테이블 만들기
CREATE TABLE MEMBER_LOG (
LOG_ID NUMBER GENERATED ALWAYS AS IDENTITY, -- 자동 증가하는 로그 번호
MEMBER_ID VARCHAR2(20), -- 가입한 회원 아이디
ACTION VARCHAR2(100), -- 어떤 행동을 했는지 기록 (가입함 등)
ACTION_DATE DATE DEFAULT SYSDATE -- 언제 행동했는지 (기본값: 현재시간)
);
2. 트리거 만들기
-- 🎯 트리거 생성
CREATE OR REPLACE TRIGGER trg_member_insert_log
AFTER INSERT -- INSERT가 끝난 "뒤에" 실행된다
ON MEMBER -- MEMBER 테이블에 대해 감시한다
FOR EACH ROW -- 한 줄(레코드)마다 작동한다
BEGIN
-- 👇 INSERT가 발생했을 때 자동으로 MEMBER_LOG에 기록 남기기
INSERT INTO MEMBER_LOG (MEMBER_ID, ACTION)
VALUES (:NEW.MEMBER_ID, '회원가입 완료');
-- :NEW는 삽입된 데이터의 값을 가리킨다.
END;
/
3. 사용 예시
-- 🌱 새로운 회원 가입
INSERT INTO MEMBER (MEMBER_ID, MEMBER_NAME)
VALUES ('hong123', '홍길동');
-- ✅ 가입되면, 자동으로 MEMBER_LOG에도 기록 남음
SELECT * FROM MEMBER_LOG;
결과 (로그 테이블):
| LOG_ID | MEMBER_ID | ACTION | ACTION_DATE |
| 1 | hong123 | 회원가입 완료 | 2025-04-29 13:00 |
✨ 중요한 부분 주석 요약
| 코드 | 설명 |
| CREATE OR REPLACE TRIGGER | 트리거를 새로 만들거나 수정한다 |
| AFTER INSERT | INSERT 끝난 뒤에 작동 |
| ON 테이블명 | 어느 테이블을 감시할지 지정 |
| FOR EACH ROW | 데이터 한 줄마다 트리거 실행 |
| :NEW.컬럼명 | 새로 추가된 값 읽을 때 사용 |
| INSERT INTO | 로그 테이블에 새로운 기록을 추가 |
🔥 최종 요약
- MEMBER 테이블에 누가 회원가입하면
- 자동으로 MEMBER_LOG 테이블에 "회원가입 완료" 기록이 들어감
- 우리는 트리거 덕분에 일일이 INSERT 안 해도 된다!
📢 주의할 점
- 트리거는 자동으로 작동하니까 몰래 실행된다. (코드에 별도로 호출하는 코드가 없음)
- 만약 트리거가 많아지면, 디버깅이 어려워질 수 있다.
- 실무에서는 정말 필요한 곳에만 트리거를 쓴다!
✅ "한 줄 요약"
트리거는 테이블에 변화가 생길 때, 자동으로 작동하는 스파이 같은 프로그램이다!
'대덕인재 > Oracle' 카테고리의 다른 글
| [Oracle] 데이터베이스 설계 (0) | 2025.06.11 |
|---|---|
| [Oracle] 스키마(schema)란? (1) | 2025.05.22 |
| [Oracle D-19] 이해가 안가서 다시 보는 왕초보 버전 프로시저(Procedure)와 함수(Function) 이야기 (0) | 2025.04.25 |
| [Oracle D-19] 함수(Function) (0) | 2025.04.25 |
| [Oracle D-19] 프로시저 (Procedure) (0) | 2025.04.25 |