IT/Oracle

오라클 Job 기능을 활용한 Batch 구성 실습해보기 [ORACLE 배치, 스케줄러, 주의사항]

귀차니즘 극복 2023. 2. 17. 11:31
728x90
반응형

IT를 하는 사람이라면 Batch job에 대해서 고민이 많습니다.

 

Shell scripts로 작성해서 배치를 수행하는 방법도 있고, Java로 구성해서 WAS를 통해서 배치를 수행하는 방법들을 많이 사용하고 있습니다.

 

인프라 구성에 따라 다르겠지만, 만약 다른 원격지의 데이터소스(Datasource)를 바라보지 않는 내부 데이터를 활용해 집계하는 Batch의 경우, 굳이 WAS를 통해 Batch job을 구성하는 것은 오히려 비효율적일 수 있지요.

 

원격지의 데이터를 가져올 필요가 없음에도 불구하고 WAS가 죽어서 Batch가 수행되지 않으면 난감한 상황들이 많이 발생하기 때문이죠. 생각보다 DB보다 WAS들에 배포 등 작업이 많기 때문에 더더욱 그런 환경이기도 하구요.

 

쉘스크립트(Shell Scripts)를 활용해 DB서버 내에서 Batch를 구성할 수 있지만, 작업의 스케줄이나 작업 결과를 가시적으로 보기는 어려운 단점들이 있어서 Oracle Job 사용을 선호합니다.

 

그럼 Oracle job을 어떻게 설정하고 확인할 수 있는지 아래의 사례를 통해 알아볼게요.

 

 

 

 

1. 작업환경 구성

먼저 배치에서 가장 핵심이 되는 프로시져를 만들기 전 작업환경을 구성합니다.

 

Procedure 수행한 결과를 확인하기 위해 임시 테이블인 TT_JOB_TEST01 테이블을 생성하고, 이 임시테이블의 키값을 정의하기 위해 TS_JOB_TEST_SEQ 시퀀스를 아래와 같이 생성합니다.

 

/* 테스트 데이터를 저장할 테이블 생성 */
-- 1. 생성
CREATE TABLE TT_JOB_TEST01(NO NUMBER, NAME VARCHAR2(10));
-- 2.삭제
DROP TABLE TT_JOB_TEST01;

/* 테스트 데이터를 순차적으로 보기 위한 SEQUENCE 생성 */
-- 1. 생성
CREATE SEQUENCE TS_JOB_TEST_SEQ;
-- 2.삭제
DROP SEQUENCE TS_JOB_TEST_SEQ;

 

그다음 Batch에서 로직의 핵심인 TP_INSERT_JOB_TEST01 프로시져를 생성합니다.

 

/* JOB으로 등록할 PROCEDURE */
-- 1. 생성
CREATE OR REPLACE PROCEDURE TP_INSERT_JOB_TEST01
  IS
    BEGIN
      INSERT INTO TT_JOB_TEST01 VALUES ( TS_JOB_TEST_SEQ.NEXTVAL, DBMS_RANDOM.STRING('A', 3));
    END
;
-- 2.삭제
DROP PROCEDURE TP_INSERT_JOB_TEST01;

 

위 프로시져에서는 JOB을 테스트할 목적이기 때문에, 단순히 INSERT 문장으로 TT_JOB_TEST01 테이블에 데이터를 넣어주는 기능을 합니다.

 

배치가 제대로 돌아간다면 이 테이블에 데이터가 들어가 확인할 수 있습니다.

 

 

 

2. JOB 생성

배치의 로직은 작성했으니 이제 아래와 같이 Oracle Job에 프로시져를 등록 합니다.
 
/* PRCEDURE를 JOB으로 등록 */
DECLARE JNO NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:JNO, 'TP_INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 1/24/60', FALSE);
END;
 

위에 표기된 SYSDATE는 현재부터 해당 JOB을 수행한다는 의미이고, 뒤에 붙은 SYSDATE + 1/24/60은 실행 주기를 의미합니다. 즉 지금부터 1분 마다 위 프로시져를 수행하라는 뜻이죠.

 

1분 외에 배치를 수행하고 싶다면 아래 내용을 참고하시면 됩니다.

 

sysdate+7 : 7일에 한번
sysdate+1 : 하루에 한번
sysdate+1/24 : 한 시간에 한번
sysdate+1/24/6 : 10분에 한번
sysdate+5/24/60 : 5분에 한번
sysdate+1/24/60 : 1분에 한번

 

반응형

 

JOB이 제대로 등록되었는지 확인하려면 아래 쿼리를 통해 확인할 수 있습니다.

SELECT * 
  FROM USER_JOBS;

위 쿼리를 실행하면 아래와 같이 나옵니다.

 

하지만 여기서 주의해야할 사항이 있는데요.

 

계속 기다려도 결과 테이블에 데이터가 들어가지 않아서 배치가 수행되지 않는 것 같아, Connection을 끊고 확인하려 했더니 아래와 같은 메세지가 나옵니다.

 

 

즉, 위에서 JOB을 등록 한 후 commit이 반드시 필요하다는 것!

 

 

만약 실제 commit을 하지 않고 끊고 새로운 세션으로 재연결을 하면, 아래와 같이 등록된 JOB이 없는 것을 알 수 있습니다.

 

 

다시 한번 JOB을 등록하고 이번에는 제대로 COMMIT을 했습니다. JOB번호가 1이 증가한 22인것을 확인할 수 있습니다.

 

 

 

3.  JOB 수행결과 확인

 

이제 오라클 JOB이 제대로 수행되었는지 확인해 봅니다.

 

 

1. USER_JOBS의 내용

 

아래와 같이 방금 수행된 LAST_DATE와 LAST_SEC이 등록된 것을 알 수 있습니다. 이에 따라 다음에 수행할 스케줄이 NEXT_DATE와 NEXT_SEC로 등록된 것을 확인할 수 있습니다.

 

 

 

이제는 실제 수행되어 결과 데이터가 들어갔는지 확인해봐야겠죠.

 

 

2. TT_JOB_TEST01의 내용

 

아래와 같이 NO에는 순차적인 시퀀스 값이, 그리고 NAME에는 렌덤한 문자열이 제대로 들어간 것을 확인할 수 있습니다.

 

 

 

4. 등록된 JOB 삭제

 

오라클 JOB을 등록해 배치가 제대로 수행되는 것을 확인했으니, JOB에서 제거하는 방법도 알아봐야겠지요.

 

아래와 같이 수행해 주면 특정 JOB을 제거할 수 있습니다.

 
/* 등록된 JOB 삭제 */
EXEC DBMS_JOB.REMOVE('22');
COMMIT;

 

등록할 때와 마찬가지로  COMMIT이 필요합니다. 만약 COMMIT을 하지 않으면 connection 해제 시 아래와 같이 나오게 되고 실제 삭제처리가 완료되지 않습니다.

 

 

COMMIT까지 완료하면, 아래와 같이 JOB 작업결과가 깨끗하게 사라진 것을 확인할 수 있습니다.

 

 

 

 

오늘은 오라클 잡을 통해 배치를 등록하고, 실행하고, 삭제하는 방법까지 알아보았습니다.

 

관련된 결과값이 저장되고 데이터를 통해 최근 실행 시간과 다음에 실행할 시간을 데이터로 조회할 수 있었어 더욱 편합니다.

 

 

728x90
반응형