Team Project

[Team Project] 해시태그 기능 이벤트 스케줄러 및 트리거 (Model 파트)

웹코린이 2023. 9. 6. 14:58
728x90

 

현재 프로젝트에서 관리자가 작성하는 상품 해시태그와 사용자가 작성하는 후기 해시태그가 존재한다

사용한 이벤트 스케줄러(후기 해시태그)와 트리거(상품 해시태그)를 설명하기 전에 먼저 현재 프로젝트 해시태그 관련 로직에 대해 설명을 하자면 아래와 같다

 

 

설계

ERD (후기 관련)

후기 테이블에서만 해시태그를 사용하는 것이 아니라 상품 테이블에서도 해시태그를 사용하기 때문에 해시태그 상세 테이블을 사용하여 따로 관리하도록 하였고 UNIQUE KEY의 제약조건을 사용하여 중복데이터가 존재하지 않도록 설정하였다

 

 사용자가 후기를 작성할 때 해시태그를 사용한다면 기존 후기 해시태그 테이블에서 SELECT를 통한 검사를 하여 해당 해시태그가 존재한다면 INSERT를 하지 않고 기존의 데이터를 재사용하므로써 보다 가볍게 사용할 수 있다

 

 후기 테이블에서 SELECT를 할 땐 JOIN(해시태그 상세 테이블 - 후기 해시태그 테이블)을 통해 해당 후기번호에 관련된 해시태그들이 출력되도록 하였고 후기 목록 페이지 혹은 후기 상세 페이지에서 해시태그를 클릭한다면 해당 해시태그를 사용하는 후기들이 후기 목록페이지에서 출력되도록 설계하였다

 

 

 

ERD (상품 관련)

상품 테이블에서도 후기 테이블과 마찬가지로 상품용 해시태그 테이블을 따로 분리하여 사용하였고 해시태그 상세 테이블을 통해 해당 해시태그를 찾아 접근하는 로직으로 설계하였다 

 또한 중복 데이터가 존재하지 않도록 UNIQUE KEY 제약 조건을 사용하여 관리한다

 

 상품 해시태그 테이블에서는 트리거를 사용하였는데 후기 해시태그와 같이 이벤트 스케줄러를 사용해도 되지만, 사용하므로써 공부를 하는 목적에서 사용해 보았다

 

이벤트 스케줄러

데이터베이스 시스템에서 정기적인 작업을 실행하고 관리하는 데 사용되는 기능

 

프로젝트에서의 사용

 현재까지 설계한 프로젝트에서는 관리자(사용자)가 사용하지 않는 해시태그를 찾아 직접 삭제하는 로직으로 구현이 되어 있었지만, 

사용자의 편의성을 고려하여 정기적으로 해당 해시태그가 후기에서 사용되고 있는지를 체크하고, 사용되지 않고 있다면 삭제하는 방식으로 구현하기 위해서 이벤트 스케줄러를 사용하기에 적합하다고 생각하여 해시태그 관련 기능에 적용하였다

 

 

코드 구현 

이벤트 스케줄러 사용 시 계정 권한 부여

grant execute on DBMS_SCHEDULER to [ 데이터베이스명 ];
grant create job to [ 데이터베이스명 ];

 

 

[ 사용하지 않는 해시태그 삭제 ]

BEGIN
    DBMS_SCHEDULER.create_job (
        job_name        => 'DELETE_UNUSED_HASHTAG_JOB',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN
                             DELETE FROM REVIEW_HASHTAG
								WHERE REVIEW_HASHTAG_NUM NOT IN (
  							 	SELECT DISTINCT HASHTAG_NUM
   								FROM HASHTAG_DETAIL
							);
                            END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=WEEKLY; BYDAY=MON; BYHOUR=0; BYMINUTE=0; BYSECOND=0',
        enabled         => TRUE
    );
END;

'DELETE_UNUSED_HASHTAG_JOB' 로 작업 이름을, 작업의 타입을 특정 작업을 수행하는 데 사용되는 프로시저형 언어(PL/SQL) 로 작성 하였다

 

 반복될 때마다 실행되어야할 작업은 HASHTAG_DETAIL 테이블에서 해당 HASHTAG_NUM이 존재하지 않는다면 삭제되는 방식으로 구현하였다

 

시작 시간은 트리거를 실행시킨 시간으로 설정하였고,

job_action이 실행되는 주기를 일주일 단위로 설정하여 매주 월요일이 되는 00시에 이벤트 스케줄러가 동작하게 된다

 

 

코드 시연

아래의 코드 시연은 job_action이 잘 실행되는 지 확인하기 위해 주기를 60초로 바꿈

 

 

이벤트 스케줄러 코드

BEGIN
    DBMS_SCHEDULER.create_job (
        job_name        => 'DELETE_UNUSED_HASHTAG_JOB',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN
                             DELETE FROM REVIEW_HASHTAG
								WHERE REVIEW_HASHTAG_NUM NOT IN (
  							 	SELECT DISTINCT HASHTAG_NUM
   								FROM HASHTAG_DETAIL
							);
                            END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=SECONDLY; INTERVAL=60',
        enabled         => TRUE
    );
END;

 

 

 

이벤트 스케줄러 적용 후 삭제 되기 전

 

 

이벤트 스케줄러 적용 후 삭제된 후

 

ITEM_NUM(후기 번호)가 NULL로 출력되었을 시 어떠한 후기에서도 사용되지 않고 있는 해시태그이기 때문에 1분이 지난 시점에서 해당 해시태그가 자동으로 삭제되는 것을 확인할 수 있다

 

 

 

트리거

특정 조건이나 사건이 발생하면 자동으로 특정 동작이 실행되도록 설정된 기능

 

 

프로젝트에서의 사용

 위의 후기 해시태그와 마찬가지로 해시태그가 삭제되는 로직은 같지만, 발생하는 시점이 다르다는 점이 있고 현재는 INSERT 가 수행되기 전의 시점으로 설정하였다

 

 

코드 구현

 

트리거 코드

CREATE OR REPLACE TRIGGER DELETE_UNUSED_TEA_HASHTAG
BEFORE INSERT  -- 이벤트 수행 지점 설정
ON TEA_HASHTAG
FOR EACH ROW
BEGIN
	DELETE FROM TEA_HASHTAG
	WHERE TEA_HASHTAG_NUM NOT IN ( 
		SELECT DISTINCT HASHTAG_NUM
		FROM HASHTAG_DETAIL
	);
END;

'DELETE_UNUSED_TEA_HASHTAG' 라는 이름으로 설정된 트리거는 INSERT가 수행되기 전에 실행되고 각 행마다 트리거가 실행되도록 설정하였다

 만약 HASHTAG_NUM이 HASHTAG_DETAIL에 존재하지 않는다면 TEA_HASHTAG 테이블의 해당 해시태그가 삭제되는 로직으로 작성하였다

 

 

코드 시연

 

트리거 실행되기 전

 

 

트리거 실행 후

 

해당 해시태그가 어떠한 상품에서도 사용되고 있지 않아 LEFT OUTER JOIN을 했을 때 NULL로 출력되어 있고, INSERT 되기 전에 TEA_HASHTAG 테이블에서 먼저 삭제한 후 INSERT 쿼리가 실행 되는 것을 확인할 수 있다

728x90