ChamomileGuides 3.0.4 Help

배치 운영 가이드

개요

배치 실행 어플리케이션이란 개발된 배치 응용 프로그램을 스케줄링하여 실행이 가능하도록 해주는 어플리케이션으로 배치 실행 어플리케이션에서 각 개별 배치 응용 프로그램을 등록, 스케줄링하여 Process Fork 하는방식으로 실행하고 실행이력을 저장하는 기능을 수행하는 Stand Alone 어플리케이션이다.

image-20200915154621951

시스템 구성

image-20200915154742257

단순 산술적인 계산으로 동시실행 배치프로그램의 최적 건수는 CPU - 1개이다.(배치실행 어플리케이션 1CPU + 배치별 1CPU)

중소규모이거나 서버의 용량이 현재 동시 실행 배치를 수행할수 있을 정도의 Scale Up이 가능하다면 기본 단일 Node로 구성한다.

  • Active: 현재 배치 실행 어플리케이션 및 배치 응용 프로그램을 실행

  • Standby: Active 서버가 장애 발생 시 대체될 서버

응용어플리케이션의 설치 및 설정은 동일하게 유지되어야 하며 deploy 디렉터리에 배포된 배치 응용 프로그램도 항상 Active + Standby 양쪽 모두 배포되어 현행화 되어있어야 한다.

배치 실행 어플리케이션 설치

배치 실행 어플리케이션 최초 설치 및 설정에 관한 내용은 배치 설치 가이드를 참조한다.

디렉터리 및 파일 구조

설치 후의 어플리케이션의 디렉터리 구조는 다음과 같다..

디렉토리

설명

수정가능여부

./lib

실행 어플케이션에서 사용하는 라이브러리 JAR가 위치하는 디렉터리

N

./webapp

웹 어플리케이션 디렉터리

N

./conf

실행 어플리케이션 설정파일 디렉터리

N

./conf/application.xml

실행 어플리케이션의 설정파일 초기 설정 후 관리자 웹콘솔의 포트 및 SSL 인증서 등의 변경이 없다면 수정할 필요는 없음.

Y

./conf/application.properties

실행 어플리케이션의 설정 프로퍼티 파일 실행 어플리케이션에서 사용하는 데이터베이스 접속정보 등이 기술되어있음. 마찬가지로 초기 설정 후 데이터베이스 접속정보등이 변경되지 않는다면 변경될 내용은 없음.

Y

./conf/message-manager.xml

배치 실행 시 전송할 알림메시지에 대한 설정 메시지 전송 Broker 클래스, 메시지 템플릿 등을 정의

Y

./conf/log4j2.xml

Logj4 로깅 설정 파일 운영환경은 로그레벨 ‘INFO’를 권장함.

Y

./conf/mybatis.xml

실행 어플리케이션 MYBATIS 설정파일

N

./conf/spring-batch.log4j2.xml

개별 배치 프로그램에서 사용되는 log4j2 설정파일

N

./conf/spring-batch.xml

개별 배치 프로그램 중 Spring Batch에서 사용하는 설정파일

N

./conf/project

실제 개발된 배치 프로그램에서 사용할 설정파일이 위치하는 디렉터리

Y

./conf/project/project.xml

개발된 배치 프로그램에서 사용할 spring or spring batch 설정파일이다.

Y

./deploy

실제 개발된 배치 프로그램의 jar 및 class들이 deploy되는 위치

N

./application.sh

배치 실행어플리케이션의 기동,종료 shellscript

N

./application.profile

배치 실행 어플리케이션 실행 시 사용할 프로파일 정보 기본으로 JAVA_OPTS 등 java 실행시 옵션이 정의 되어있음. java 옵션값에 대한 커스터마이징이 필요하다면 applicatin.sh 가 아니라 해당 application.profile을 수정

Y

./chamomile-batch-xxx.jar

배치 실행 어플리케이션의 JAR 바이너리

N

어플리케이션 설정

관리자 접속화면 접속 포트 변경

관리자 어드민 웹어플리케이션은 배치 실행 어플리케이션 내부의 Embedded Tomcat 으로 구동된다. 포트를 변경하기 위해서는 어플리케이션 설정파일(./conf/application.xml)을 변경 후 재기동한다.

chamomile@host> vim ./conf/application.xml … <webServer id="application" port="6100"> … </webServer> … chamomile@host> ./application.sh stop && ./application.sh start

보안프로토콜(SSL) 적용(HTTPS)

HTTPS로 운영할 경우 인증서를 업로드 후 배치 실행어플리케이션의 설정파일(./conf/application.xml)을 아래와 같이 수정 후 재기동 한다. (배포본 최초 설치시 HTTPS에 사설인증서인 포함된 상태롤 설치된다.) 만약, https 접속대신 http로 접속하고 싶은 경우, ssl 태그를 제거한다.

chamomile@host> vim ./conf/application.xml … <webServer id="application" port="6100"> <ssl> <keyStorePath>conf/ssl/keystore</keyStorePath> <keyStoreType>pkcs12</keyStoreType> <keyStorePass>1234</keyStorePass> </ssl> … </webServer>… chamomile@host> ./application.sh stop && ./application.sh start
  • SSL 제거 권장 - 관리노드와 실행노드 API 통신 필요(Handshake 에러 발생)

데이터베이스 접속정보 변경

데이터베이스의 접속 정보를 수정하는 경우 배치 실행 어플리케이션 설정 프로퍼티(./conf/application.properties)를 수정 후 재기동한다. 수정할 범주는 아래와 같다.

chamomile@host> vim ./conf/application.properties … # 데이터베이스 아이디 설정(오라클:ORACLE, MariaDB/MySQL: MYSQL, SQLServer: MSSQL, 티베로: TIBERO) databaseId=MYSQL # OLTP connection pool dataSource.oltp.driver=com.mysql.jdbc.Driver dataSource.oltp.url=jdbc:mysql://[데이터베이스서버]:3306/chamomile dataSource.oltp.username=[사용자] dataSource.oltp.password=ENC([패스워드PBE]) dataSource.oltp.initialSize=5 dataSource.oltp.maxActive=10 dataSource.oltp.validationQuery=select 1 from dual # OLAP connection pool dataSource.olap.driver=com.mysql.jdbc.Driver dataSource.olap.url=jdbc:mysql://10.131.7.140:3306/chamomile dataSource.olap.username=[사용자] dataSource.olap.password=ENC(([패스워드PBE]) dataSource.olap.initialSize=5 dataSource.olap.maxActive=10 dataSource.olap.validationQuery=select 1 from dual # BATCH connection pool dataSource.batch.driver=com.mysql.jdbc.Driver dataSource.batch.url=jdbc:mysql://[데이터베이스서버]:3306/chamomile dataSource.batch.username=[사용자] dataSource.batch.password=ENC([패스워드PBE]) dataSource.batch.initialSize=2 dataSource.batch.maxActive=5 dataSource.batch.validationQuery=select 1 from dual …
  • 데이터베이스 유형 설정(databaseId): 데이터베이스의 유형코드로 ORACLE, MYSQL, MSSQL, TIBERO 4종료의 DBMS를 지원한다.

  • OLTP 접속정보 : 온라인 트랜잭션에서 사용하는 데이터소스로 온라인 트랜잭션의 특성 상 socket read timeout이 짧은 편이다. (관리성격의 웹어플리케이션이 이므로 Request 가 많지 않음으로 특별히 설정이 없어도 무방하다.)

  • OLAP 접속정보 : 배치 실행 등 백그라운드 작업에서 사용되는 데이터소스로 배치 프로그램의 이력저장 및 백그라운드에서 처리되는 트랜잭션을 담당한다. 특성 상 Long Transaction을 수행해야되는 경우가 있음으로 read timeout의 경우 OLTP에 비하여 긴 편이다.

  • BATCH 접속정보 : 구동되는 배치 프로그램(spring-batch)의 JobRepository 에서 사용되는 데이터 소스이다. SPRING BATCH 배치 프로그램을 실행 할때에 기본적으로 로딩되는 데이터소스로 socket read time은 매우 긴 편이며(실제 배치 쿼리의 경우 몇시간씩 수행되는 경우도 있음) Capacity의 경우는 정책에 따라 다르겠지만 다수 적은 편이다.

보안설정을 위한 PBE(Password-Based Encryption) 적용

소스 유출등과 같은 보안상의 사유로 설정파일의 내용 중 보안에 민감한 정보(접속정보 등)에 대해서는 설정파일의 내용을 암호화 하여 저장하여야 한다.

예를 들어

dataSource.oltp.username= chamomile datasource.oltp.password=1234

의 평문은 PBE를 적용하여 보안설정한 경우

dataSource.oltp.username=chamomile datasource.oltp.password= ENC(LsMLxTKlrgY98GmfWWXraU67oZyg9zH/)

이런식으로 보안설정 할수 있다.

해당 PBE값을 생성하기위하여 Utility를 제공한다.

chamomile@host> ./application.sh crypto Please enter 1.Encryption or 2.Decryption:1 enter original value:ENC([password]) encrypted:ENC(Ofo0P6xkjZH8R1rdlMoq6oIXEvitpU4B) decrypted:[password]

로그레벨 변경 (log4j2.xml)

배치 실행 어플리케이션의 Logge는 Log4j2를 사용한다. 로그레벨의 변경을 위해서는 아래와 같이 log4j2.xml 설정파일을 수정한다. 수정된 내용은 어플리케이션의 재기동없이 몇초 후 적용된다.

chamomile@host> vim ./conf/log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration monitorInterval="3"> … <Loggers> <!-- Root Logger --> <Root level="INFO"> <AppenderRef ref="consoleAppender"/> <AppenderRef ref="fileAppender"/> </Root> </Loggers> … </Configuration>

어플리케이션 컨트롤

배치 실행 어플리케이션의 컨트롤은

  • 어플리케이션 계정으로 switch user (user\@host\> su - chamomile)

  • 어플리케이션 설치home 경로로 이동

  • application.sh 쉘 스크립트를 사용

하여 수행한다.

어플리케이션 프로세스 확인

프로세스가 현재 존재한다면 아래와 같이 화면에 출력된다.

chamomile@host> ./application.sh status Application Status chamomi+ 2929 1 2 09:12 pts/1 Sl 1:20 java -server -Djava.net.preferIPv4Stack=true -Djava.s….. chamomile@host>

어플리케이션 프로세스 시작

chamomile@host> ./application.sh start

어플리케이션 로그파일 Tailing

chamomile@host> ./application.sh log [2018-09-12 10:17:37.461][INFO ](ApplicationContainer.java:119)- _______ _____ __ _______ __ _________ ____ / ___/ // / _ | / |/ / __ \/ |/ / _/ / / __/ / /__/ _ / __ |/ /|_/ / /_/ / /|_/ // // /__/ _/ \___/_//_/_/ |_/_/ /_/\____/_/ /_/___/____/___/ [2018-09-12 10:17:54.425][INFO ](FrameworkServlet.java:489)-FrameworkServlet 'dispatcherServlet': initialization started [2018-09-12 10:17:54.454][INFO ](AbstractApplicationContext.java:583)-Refreshing WebApplicationContext for namespace 'dispatcherServlet-servlet': startup date [Wed Sep 12 10:17:54 KST 2018]; root of context hierarchy …

어플리케이션 종료

기본적으로 어플리케이션의 종료는 Graceful Shutdonw으로 처리된다. (내부적으로는 SIGKILL(9-Kill Signal)이 아닌 SIGTERM(15-Terminatin Signal) 시그널 전송)

현재 스케줄러를 shutdown 후 현재 실행중인 배치가 존재한다면 모두 완료될때까지 대기한다.

강제로 KILL 시그널을 보내는 경우 실행중이던 배치 프로그램은 모두 RUNNING 상태로 종료되어 버리므로 꼭 필요한 상황이 아닌 경우 Graceful Shutdown 할것을 권한다.

# 배치 실행 어플리케이션 프로세스 종료 chamomile@host> ./application.sh stop shutting down..................... shutdown is complete. chamomile@host>

배치 응용 프로그램의 배포

배포 바이너리 종류

배치 실행 어플리케이션에서 실행하기 위해 개발된 배치 응용프로그램의 배포 과정에 대하여 설명한다.

기본적으로 배치 응용 프로그램의 배포 버전은

  • JAR 바이너리 형태

  • *.class 바이너리 형태 (단 class 단위 배포인 경우 package path가 일치해야함)

모두를 지원한다.

배포 디렉터리 경로

해당 배치 응용 프로그램을 deloy 할 디렉터리 경로는

$/deploy

에 위치 시킨다.

배치 응용프로그램에서 사용하는 JDBC driver 및 JAR 라이브러리 역시 동일한 경로에 위치 시킨다.

배치 응용 프로그램의 SPRING-BATCH 설정 정보

배치 응용 프로그램을 Spring-batch 기반의 프로그램으로 개발할 경우 해당 프로젝트에서 사용하는 데이터베이스 접속 정보 및 기타 설정은 다음의 위치에 작성한다.

$/conf/project/project.xml

기본설치시 default로 chamomile-batch-template프로젝트의 Spring-batch 설정파일이 해당 경로에 위치해 있다. 별도의 경로를 사용하거나 파일명을 변경하고자 하는 경우는 ./conf/application.xml에서 spring batch 설정파일 경로를 수정한다.(chamomile-batch-template기반으로 개발된 경우는 추천하지 않는다.)

chamomile@host> vim ./conf/application.xml … <!-- Spring Batch Project Configuration --> <springJobLauncher> <contextFiles>conf/project/project.xml</contextFiles> <javaOpts>-Xms256m -Xmx512m</javaOpts> </springJobLauncher> …

배치 워크플로우 관리

개요

배치 워크플로우란 하나의 배치업무처리를 여러 배치 프로그램들의 플로우로 구성한 집합을 의미한다.

좌측 메뉴에서 [배치 워크프로우 관리] 메뉴를 클릭하여 등록화면으로 이동한다.

카테고리 관리

각각의 배치 프로그램을 업무별 카테고리로 계층화, 그룹화 하여 관리할 수 있는 기능이다.

0aa0c5d922da3600b63a45e423c9f52f

카테고리 등록,설정

(1)버튼을 클릭하여 카테고리 설정 팝업을 오픈한다.

Bb46ee97126256c746014fbcc9f9375c
  1. 카테고리 아이디: 해당 카테고리의 고유식별아이디

  2. 상위 카테고리: [변경] 버튼을 클릭하여 상위 카테고리를 변경할 수 있다.

  3. 카테고리 이름: 해당 카테고리에 대한 명칭이다.

  4. 카테고리 관리자: [+] 버튼을 클릭하여 해당 카테고리의 관리자를 추가할 수 있다.
    카테고리 관리자는 해당 카테고리의 배치 워크플로우에 대한 추가, 수정, 삭제, 실행등을 직접 처리할 수 있는 권한을 가진다. (일반 사용자는 주요 처리에 대해서는 승인 프로세스가 필요)

카테고리 위치 변경

(2),(3) 버튼을 클릭하여 해당 레벨에서의 출력 순서를 변경할수 있다.

D633257208b8302c0c87d875fc429ccf

하위 카테고리 추가

(4) 버튼을 클릭하여 하위 카테고리를 추가할수 있다.

2781e797052ae297c062da540a409bfb

배치 워크플로우 등록(수정)

20231123152757

위의 배치 워크플로우 관리 화면에서 신규 추가의 경우 우측 상단의 [+] 버튼을클릭, 기존 등록건을 확인 또는 수정하기 위해서는 해당 건을 클릭한다 (워크플로우 변경 이력은 로그 테이블에 관리되고 있다.)

402e2abaf7ba5fa3ada38523f7fa20af

배치 워크플로우 정보

Cfe7a13392250c492c1b3e14f932975c
  1. 아이디: 배치워크플로우의 고유 아이디이다. 각 아이디는 중복될수 없다. 신규등록시에는 [중복체크]버튼을 클릭하여 등록전 체크 하여야한다.

  2. 이름: 해당 워크플로우의 명칭이다.

  3. 카테고리: 해당 배치 워크플로우를 위치할 업무 카테고리를 [변경]버튼을 클릭하여 선택한다.

1e1050c5a9f585c9b85c6ae1311d096d
  1. 스케줄 예약: 배치를 시간에 따라 스케줄링 해야되는 경우 (대부분의 케이스) 해당 스케줄 내용을 입력한다. 기본적으로 스케줄 표현식은 Cron Expression을 사용하나 해당 표현식은 Quartz 에서 사용되는 Cron 표현식으로 Linux Crontab의 표현식과 약간의 차이가 있음으로Quartz 의 Cron Expression을 참고한다.
    Quartz Document: http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger.html

  2. 스케줄 사용여부: 스케줄 사용여부를 선택한다. 주기적으로 수행되어야 되는 배치 프로그램의 경우 사용을 선택하고, 수시 작업 같이 특정 이벤트 시에만 수행되어야되는 배치 프로그램의 경우 사용않함으로 설정 후 이벤트 발생될때만 매뉴얼로 실행한다.

  3. 설명: 해당 배치 워크플로우에 대한 설명을 입력한다. 유지보수 차원에서 해당 배치업무의 설명 및 특이사항등을 기술한다.

  4. 패라미터: 배치 프로그램에서 사용할 패라미터를 설정한다. 해당 패라미터는 아래와 같이 고정값을 사용할수도 있으며 [상수 패라미터 설정의 예]

B190b271423e9ed6cb1ca4f9268555c0

시스템 일자 등 실행 시 동적으로 생성 되어야 하는 패라미터의 경우 제공되는 매크로 함수 문법을 사용하여 등록할수 있다. [시스템 시간 설정의 예]

60afbe81af6550c1bd1ba4cc58c4cf9d

SYSDATE_YYYYMMDD = ${SYSDATE(‘yyyyMMdd’)} 로 설정할 경우 실행 시 시간을 yyyyMMdd 날짜 포맷으로 SYSDATE_YYYYMMDD=20181231 이라는 값으로 변환된다. [영업일자 설정의 예]

E572525ae4675d1305c0b8e9f07a4a2a
BIZDATE_YYYYMMDD=\${BIZDATE('yyyyMMdd','HOUR',-9)}로 설정할 경우 실행 시 BIZDATE_YYYMMDD라는 패라미터는 -9 시간 딜레이된 시간의 yyyyMMdd 날짜 포맷으로 변환된다.

시스템시간이 7일 새벽 03시라면 위의 BIZDATE_YYYYMMDD는 -9시간 딜레이된 업무시간이므로 6일이된다. 해당 영업일자를 딜레이 시간으로 처리하는 이유는 보통 새벽에 수행되는 7일자의 배치 패라미터로 수행시간이 아닌 영업일자가 입력되는 경우가 많기 때문임. (보통 마감배치들이 존재하는 시스템에서는 영업시간이 9시 부터이므로 -9시간 딜레이 한 시간으로 처리된다.)

  1. 조건: 실행 시 체크할 실행 조건을 입력할 수 있다. 조건 선택 후 해당 조건에 부합되는 경우 처리를 어떻게 할지를 선택한다.

    • SKIP: 실행을 SKIP한다. (실행이력에는 SKIP으로 이력은 존재)

    • FAILED: 실행 오류로 처리한다. (실행이력에는 FAILED로 이력 등록) . 현재는 아래 두가지의 조건체크 함수를 지원한다.

Name

Arguments

Description

IS_HOLIDAY

일자(포맷 yyyyMMdd)

등록된 공유일이면 true, 아닐 경우는 false 반환

FILE_NOT_FOUND

파일 Path (절대경로,상대경로 모두 가능

파일이 존재하지 않으면 true, 존재할 경우는 false (미존재이거나 파일이 writing 중일 경우 기본 1시간 대기)

  • [IS_HOLIDAY - 공휴일 체크]


    공휴일 여부를 체크 true일 경우 SKIP하거나 FAILED 처리된다. 아래 예제의 경우 패라미터 정보에서 BIZDATE_YYYYMMDD라는 패라미터로 영업일자를 설정 후 해당 영업일자(BIZDATE_YYYYMMDD)가 공휴일인지 여부를 조건으로 설정한 예이다.


    IS_HOLIDAY = \#

205c4e273a43a6a623f68a70d2a0d85b
  • [FILE_NOT_FOUND – 파일 존재여부 체크]


    입력된 값의 경로에 파일이 존재하는지 여부를 체크, true 일경우(파일이 존재하지 않을 경우) SKIP하거나 FAILED 처리한다. (해당 함수의 경우 파일이 미존재할 경우 1시간을 체크하며 대기한다.)

배치 Job 플로우

개발된 배치 프로그램을 Job으로 등록하는 과정이다. 각각의 Job들은 실행 순서를 설정할 수 있다.

아래 화면은 최초 설치 시 샘플로 등록되는 배치 워크플로우의 Job설정으로 JOB-1 \> JOB-2 \> JOB-3이 순차적으로 실행되는 예제이다.

Ba3064c510db4861ce48646b6159f038
  1. 아이디: 선택한 JOB의 고유식별아이디로 최초 등록 후에는 변경은 불가능하다.

  2. 이름: 선택한 JOB을 나타내는 이름을 입력한다.

  3. 유형: 해당 JOB의 유형을 선택한다. 현재는 기본 spring-batch 프로그램과의 연계이므로 기본CLI 유형과 SPRING 유형 2가지가 존재한다.
    * CLI (Command Line Interface): 시스템 명령어로 실행하는 배치 프로그램 또는 쉘스크립트를 호출하거나 직접 리눅스 명령어를 실행
    * SPRING(spring-batch): spring-batch 프레임워크로 개발된 배치프로그램을 호출

  4. 명령어: 실행할 JOB의 명령어를 입력한다. 해당 명령어는 [유형] 선택에 따라 입력 Syntax가 다르다. * CLI (Command Line Interface)인 경우: 실행할 리눅스 명령어를 입력한다. 예로 ls -al 이란 명령어를 실행하고 싶은 경우 해당 명령어에 옵션 포함하여 입력할 있으며 -al옵션은 따로 입력하고자하는 경우 다음에 설명할 변수에 입력할수도 있다. * SPRING(spring-batch)의 경우: spring batch 설정이 기술된 XML의 job의 경로를 기술한다.
    명령어 설정 규칙은 {spring-batch XML 경로} + 구분자($) + {spring batch job아이디}
    템플릿 프로젝트 데모 배치의 경우 소스 XML 경로는 /net/lotte/chamomile/batch/template/employer/EmployerJob.xml
    job 설정정보는 아래와 같을 경우
    \<job id="employerExtractJob" xmlns="http://www.springframework.org/schema/batch"\>
    해당 배치 프로그램의 [명령어] 값은
    /net/lotte/chamomile/batch/template/employer/EmployerJob.xml$employerExtractJob 로 등록된다.

  5. 변수: Job 실행 시 추가될 Argument를 설정한다. 명령어 입력과 동일하게 [유형] 선택에 따라 입력 Syntax가 다르다.
    * CLI (Command Line Interface)인 경우: 입력할 명령어 구문에 추가될 option 또는 argument를 입력한다. 예로 ls -al 이란 명령어를 실행하고 싶은 경우 ls 는 명령어에, -al 옵션은 변수에 입력할수 다. * SPRING(spring-batch)의 경우: spring batch 프로그램 실행 시 넘겨줄 패라미터 값을 JSON 포맷으로 기술한다. (실제 spring batch 프로그램을 프로세스 fork 할때 JSON형식으로 정의된argument가 BASE64 인코딩되어 전달됨) spring batch 프로그램에서 아래와 같이 정의된 변수는

    @Bean @StepScope ItemStreamReader<Employer> employerExtractItemReader( @Value("#{jobParameters['hireDateFrom']}")String hireDateFrom @Value("#{jobParameters['hireDateTo']}")String hireDateTo ) {…. 등록시 아래와 같은 JSON 포맷의 데이터로 설정한다. { "hireDateFrom": 20180101", "hireDateTo": 20181231" }
  6. 로그레벨: 배치 프로그램 실행 시 배치프로그램 내부에서 작성된 로그의 로그레벨이다. 해당 로그 레벨은 배치 프로그램이 log4j2를 기반으로 로깅될때만 작동한다. 제공되는 템플릿 프로젝트 역시 log4j2 기반이다.
    로그래벨은 기본 아래 3가지 레벨을 지원한다.
    * DEBUG레벨: 개발환경에 적합한 로그 레벨로 운영시에는 설정하지 않을 것을 권장한다. Spring batch 프레임워크에서 로깅되는 내용이 모두 출력되므로 로그 량 및 부하가 상당히 심한편.
    * INFO레벨: 운영(또는 통합테스트) 환경에 적합한 로그 레벨이다. LOGGER.info 이상으로 출력된 내용이 로깅된다.
    * ERROR레벨: LOGGERerror 이상으로 출력된 내용이 로깅된다. 운영환경에서 INFO레벨의 로그도 필요 없으며 오류발생 로그만 출력하고싶다면 해당 로그레벨을 설정한다.

  7. 다음 Job: 해당 Job의 실행 결과에 따른 다음 Job의 연결정보가 존재한다면 다음에 실행할 Job의 아이디를 선택한다.
    아래 다이어그램에서 JOB-1을 선택 후

    7ae8f53023f2d9d7715441f9b29dd100

    아래의 다음 Job 입력란은

    71c823f3ac72682614e04cf6549faca4

    아래와 같다.

    JOB-1 이 정상적으로 종료되었을 경우(ON = COMPETED) 다음 Job JOB-2를 실행

알림 메시지 수신자 등록

해당 배치 워크플로우 실행 시 시작,종료,오류 발생 시 그에 대한 메시지를 수신할 사용자를 등록하는 패널이다.

5ae479ab78b330de675e5b4da1e22fca
20231123172240.png

[알림 레벨]

각 사용자 별 메시지 수신의 레벨을 설정할수 있다.

알림 레벨 코드값

알림 레벨

DEBUG

전체(시작+종료)

배치 프로그램의 시작, 종료 시 메시지 발송

INFO

종료 시

배치 프로그램이 정상 종료되었을 때 메시지 발송

ERROR

에러 시

배치 프로그램 오류 발생시 메시지 전송

배치 워크플로우 실행 이력

해당 배치 워크플로우의 최근 실행이력을 확인할수 있는 패널이다.

5233a5236faaacc6233b51ca40341007

배치 워크플로우 (재)실행 ,중지, 결과 확인

배치 워크플로우 상세 화면을 통하여 매뉴얼로 해당 배치 프로그램을 실행, 중지 할수 있다.

해당 기능은 개발환경 또는 테스트 환경에서의 테스트 배치 실행이 주목적이며

실제 운영환경에서

  • 장애발생 배치에 대한 재처리

  • 수시작업 배치프로그램의 실행

  • 현재 시스템의 상태확인을 위한 테스트 배치 실행

등의 사유를 제외하고는 대부분 스케줄 되어 처리된다.

실행 요청

[실행] 버튼을 클릭하여 실행 요청 한 후 웹화면에서는 연결된 웹소켓을 통하여 해당 배치 워크플로우의 실행 메시지를 수신하여 화면에 표시하게 된다. (일부 네트워크 상황에 따라 화면 표시에 문제가 발생할 수 있으나 실제 배치 실행과는 무관함)

204351583d1f99f4f83610291f58977a

중지 요청

[중지]버튼을 클릭하여 현재 실행 중인 배치 워크플로우에 대하여 중지요청을 할수 있다.

중지요청시 현재 RUNNING 상태인 Job은 STOPPING으로 변경되며 일정시간이 지나면 STOPPTED로 변경된다.

082676e1c7677d0c6cc917181bd27501

배치 실행 중 중지 요청은

  • 강제 중지가 아니다. (실제는 Process에 Interrupt신호를 보내거나 Spring-batch의 경우 jobOperator에게 중지를 요청하는 개념)

  • Spring-batch 로 구현 된 Job의 경우 JobOperator에게 요청을 한것으로 Srping-batch에서 판단하여 STOP이 될수도 있고 COMPLTETE까지 진행할 수도 있다.(판단 기준은 commit count와 관련이 있으며 마지막 transaction 의 chunk들을 처리중일 경우는 STOP요청이 들어와도 완료되는 경우가 많음)

으로 배치 실행 어플리케이션에서는 interrupt 를 요청하는 개념이지 강제kill하는 개념이 아니다.

배치Job 실행이력 확인

화면 우측 하단 워크플로우 실행이력 패널에서 [상세보기] 팝업 버튼을 클릭하면 실행 배치Job의 상세목록을 확인할 수 있다.

A7cb2b158b7202dedc75a26d5df6db6e

아럐와 같은 팝업화면에서 실행된 배치 Job목록을 확인할 수 있다. 순서는 실제 배치Job이 실행된 순서이다.

E7b04d74b349ca551f25147680e36f2b

로그파일 내용 확인

화면 우측 하단 워크플로우 실행이력 패널에서 [로그] 버튼을 클릭하여 해당 실행에 대한 로그파일을 조회할수 있다.

4883c081e60268a175885127cf2c055f

클릭시 새창으로 아래와 같이 로그파일의 내용이 브라우저에 출력된다. (웹기반이므로 로그파일이 대용량일 경우는(DEBUG레벨 같은 경우) 정해진 사이즈만큼만 툴력하며 전체로그는 서버에서 직접 확인)

49a6286e4a6eae1d0f166309ecef8aec

실행이력 상세화면 및 결과 강제 변경

아래와 같이 실행 아이디를 클릭하면 각 배치 워크플로우 실행이력 상세화면을 오픈할 수 있다.

F3213752b8d8f5c7303a3203a06aee46

레이아웃 구성은 배치워크플로우 셍세내역 화면과 동일하며 실제 실행된 결과들이 화면에 표시된다.

해당 화면으로 통하여 수행할수 있는 기능은

  • 장애발생건이나 일시중지건에 대한 재실행

  • 실행결과코드 및 메시지등을 매뉴얼로 변경(예를 들어 장애건에 대한 매뉴얼 조치 후 메시지에 이력을 남긴 후 상태를 COMPLETED로 강제 변경

과 같은 기능을 수행할 수 있다.

6843e08e8925a2167dc1a76f9fc17200

실행이력 조회

배치 워크플로우로 등록된 배치 프로그램들의 실행 이력을 조회하는 화면이다.

20231123150059

조회기간 및 검색 조건들이 존재하며 기본적인 기능은 앞에서 기술한 실행이력 상세화면 및 결과 강제 변경 과 동일하다.

실행이력 통계

배치 프로그램의 실행이력을 기반으로 한 통계데이터 조회화면이다. 입력된 기간의 일별,월별,년별 실행 건수를 상태별로 조회할 수 있다.

20231123150038

상태 설명

**상태 **

설명

WAIT

워크플로우 실행 수 초과 시 WAIT 상태로 대기

RUNNING

워크플로우 실행 중

SKIP

조건에 의해 워크플로우 스킵(공휴일 등)

COMPLETED

워크플로우 완료

FAILED

워크플로우 실패

STOPPING

워크플로우 중지 요청 중

STOPPED

워크플로우 중지 완료

서비스 요청

운영 시 일반 사용자와 관리자가 분리된 정책으로 운영될 경우 배치 프로그램의 등록,수정,삭제 및 실행 등은 관리자 권한을 소유한 사용자만 처리할 수 있으며 일반 사용자는 배치 프로그램의 등록,수정,삭제 및 실행 등은 서비스 요청을 등록하여 관리자가 승인하는 프로세스로 진행할 수 있다.

배치 워크플로우 신규등록, 수정, 삭제 요청

일반 사용자는 배치 워크플로우 상세 화면에서 신규등록, 수정, 삭제 할 내역을 편집 후 우측 상단 [변경요청] 또는 [삭제요청] 버튼을 클릭한다.

20231123150025

승인 요청 하는 팝업이 열리면 해당 화면에 요청에 대한 내용을 입력 후 [승인요청] 버튼을 클릭한다.

6abbb3afe0b4fbfdc5294d7d9a0863fb

입력해야하는 내용은 다음과 같다.

  • 요청 제목: 승인요청 내용에 대한 제목이다.

  • 요청 내용: 승인요청에 대한 내용으로 등록, 변경, 삭제에 대한 사유나 기타 필요한 내용을 입력한다.

  • 예약 여부: 승인 시 처리유형을 선택한다. 처리유형은[즉시 처리] 와 [예약 처리] 가 있다.

    • 즉시처리: 승인 시 즉시 처리된다. 현재 운영중인 배치에 영향이 가지 않는 경우

    • 예약처리: 특정 시간 이후에 처리되어야되는 내용인 경우 해당 항목을 선택

배치 워크플로우 실행 요청(수시 작업 시)

보통 상시 배치작업은 스케줄링을 통하여 작업이 진행된다. 그러나 업무에 따라서 특정 이벤트 발생 시 수시로 또는 일회성으로 작업이 진행되어야하는 배치 워크플로우에 대해서는 해당 업무 담당자가 해당 배치 워크플로우에 대한 실행요청을 관리자에게 요청할 수 있다.

20231123145613

입력 내용은 변경/삭제요청과 동일하나 배치 업무의 특성 상 기존 스케줄링 되어 수행 중인 다른 배치 작업에 영향을 주지 않는 시간대에 [예약처리]로 요청 한다.

8976a29c6073153833ac342aa554f9e7

배치 워크플로우 재실행 요청(장애발생 건 재처리 시)

배치 수행 중 장애가 발생되어 FAILED 처리된 배치를 재처리 하고 할 경우 일반 사용자는 관리자에게 해당 건에 대한 재수행을 요청할 수 있다.

20231123145538

먼저 실행이력 화면에서 재처리 대상건을 선택 하여 [배치 워크플로우 상세이력 화면]으로 진입 후 오류에 대한 내용을 먼저 확인 한다.

20231123145929

먼저 수행 당시의 시스템 환경적 문제로 비정상 종료되었다면 변경없이 재요청을, 만약 수행 시 패라미터 값들의 문제로 비정상 종료되었다면 해당 패라미터들을 변경 후 재요청한다.

E06e98dc521fcb6e6f845a759561cb1c

입력내용은 동일하며 수시 작업 요청시와 동일하게 기존 스케줄링 되어 수행 중인 다른 배치 작업에 영향을 주지 않는 시간대에 [예약처리]로 요청한다.

서비스 요청 조회 및 승인(반려)

관리자 권한을 소유한 사용자는 해당 서비스 요청건에 대하여 승인 또는 반려 처리를 수행할 수 있다.

20231123145425

대상 건의 요청 번호를 클릭하여 상세내용 팝업을 호출한다.

1e02445c5959085d2cde16e34697fdd8

요청 내용을 확인 후 승인(반려) 내용을 입력, [승인] 또는 [반려] 버튼을 클릭한다.

처리결과는 서비스 요청 목록에서 확인한다.

20231123145347

처리에 관련 항목의 의미는 다음과 같다.

  • 처리상태: 요청 시점에는 WAIT(대기) 상태이다. 즉시처리 또는 예약처리에 따라 처리되는 시점이 상이한데 즉시처리 요청건인 경우에는 승인 후 대략 10초 후 처리가 완료 되지만 예약 처리인 경우 예약처리 시간이 되기 전까지는 대기상태로 남아있게 된다.

  • 처리시간: 백그라운드 프로세스에서 승인된 요청건에 대하여 처리한 시간이 입력된다.

환경 설정

사용자 관리

실행 어플리케이션의 사용자는 배치 업무의 운영자로 크게 일반사용자, 관리자(관리자권한을 가진 사용자)로 분류된다.

최초 관리자 로그인

브라우저에서 https://[설치서버주소]:6100 로 접속한다.

최초 초기 관리자 아이디 및 패스워드는 ADMIN/1111이다.

20231123145347

신규 사용자 등록

좌측 메뉴에서 [환경설정 \> 사용자관리] 화면으로 이동 후 [사용자 추가] 버튼을 클릭한다.

20231123145237

신규 사용자 정보를 등록한다.

batch-admin-user-update-20240628.png

사용자 정보 수정

변경할 사용자 아이디를 클릭하여 사용자정보 변경 팝업 화면을 호출한다.

20231123145132

변경할 내용을 변경 한 후 [저장] 버튼을 클릭한다.

사용자 정보 변경 이력은 CHMM_USER_INFO_LOG 테이블에 저장되고있다.

batch-admin-user-update-20240628.png

사용자 패스워드 변경

목록에서 변경할 사용자의 [비밀번호 변경] 버튼을 클릭하여 비밀번호 변경 팝업화면을 호출한다.

20231123144958

기존 패스워드와 변경할 패스워드를 입력 후 [저장]버튼을 클릭한다.

20231123144939

사용자 삭제

사용자 정보 변경 화면을 오픈 후 [삭제] 버튼을 클릭한다. (주의사항: 사용자 정보는 완전 삭제처리된다.)

batch-admin-user-update-20240628.png

디렉터리 관리

데이터파일이 위치할 디릭터리 경로를 업무별 Alias 설정하여 배치 워크플로우 패라미터로 사용하기 위한 기능이다. 등록 시 간단한 Permissin정보, 전체 공간, 남은 공간의 정보가 출력된다. (필수 기능이 아니므로 사용 여부에 대해서는 프로젝트 정책에 따라 결정)

20231123144659

등록 후 배치 워크플로우에서 패라미터로 사용 할경우는 다음과 같이 사용이 가능하다.

Cf42ca96fe5336af5617d8a3f40bfc72

SYNTAX : ${DIR([등록한 디렉터리의 아이디])}

공휴일 관리

배치 프로그램을 스케줄할 때 주중,주말은 Cron Expression으로 등록이 가능하지만 공휴일에 대한 처리는 지원하지 않음으로 해당 화면을 통해 공휴일테이블(CHMM_BAT_HOLIDAY_INFO)에 입력 하여 해당 등록된 공유일을 체크 할수 있는 기능을 제공한다.

20231123144630

등록된 공휴일 정보는 배치 워크플로우에서 실행 시 조건 체크로 다음과 같이 사용이 가능하다.

1610892b3a39fd3846cae79e0ff3e88f
  1. 조건.이름: IS_HOLIDAY 선택

  2. 조건.변수: yyyyMMdd 포맷의 일자 문자열

  3. 조건.처리: SKIP - 공휴일이면 SKIP 처리, FAILED - 공휴일이면 FAILED 처리

Swagger UI 안내

  • 접속URL : https://localhost:6100/swagger-ui.html

    admin-swagger.png
  1. API 를 사용하기 JWT 토큰 발급을 선행해야 한다.

  • /api/token ( JWT 인증 토큰 발행 ) 해당 API를 통해 토큰을 발급 받는다.

    admin-swagger-token-20240627.png

    ex) jwt token : eyJhbGciOiJIUzI1NiJ9.eyJpZCI6ImFkbWluIiwicGFzc3dvcmQiOiIyN2QxNGVmZmEzMWE3NzJiMmVlMjE3YjhjMWIzYTAyNWZkOWY4ODhjYjA4ZmJmMDBkYmM0OTcwNzAwYjJkYmU0ZmY1MDFlMjljN2I4NTNhYiIsImF1dGhvcml0aWVzIjoiW3tcImlkXCI6XCJST0xFX0FETUlOX0lEXCIsXCJhdXRob3JpdHlcIjpcIlJPTEVfQURNSU5fSURcIn0se1wiaWRcIjpcIlJPTEVfQkFUQ0hfQURNSU5cIixcImF1dGhvcml0eVwiOlwiUk9MRV9CQVRDSF9BRE1JTlwifSx7XCJpZFwiOlwiUk9MRV9ERUZBVUxUX0lEXCIsXCJhdXRob3JpdHlcIjpcIlJPTEVfREVGQVVMVF9JRFwifV0ifQ.EVAot4Wv1lwj2Mt9nQjgVbLJVC4cvf4Gk5v-TLjgGF0

  1. Authorization 버튼을 클릭하고 Bearer + jwt token 값 입력


    admin-swagger-Authorization-2024-06-27.png
  • Bearer 와 jwt token 값 사이에 띄어쓰기를 주의한다.

FAQ & Troubleshooting

배치 실행 어플리케이션을 80 port로 서비스

Q.배치 실행 어플리케이션의 관리자 웹화면을 80 포트로 서비스 하기를 원함.

A. 보안상의 문제로 어플리케이션은root 계정이 아닌 어플리케이션 계정으로 운영된다. (배치 실행 어플리케이션의 경우 default는 chamomile 사용자 계정으로 수행됨)

리눅스는 보안상 이유로 1024이하 포트는 일반계정으로는 열수 없으므로 ./conf/application.xml에서 port를 80 port로 변경만으로는 80 포트로 서비스가 불가능하며 다음과 같은 조치가 필요하다.

Too many open files (24) 에러 발생 시

Q. 배치 실행 어플리케이션 또는 배치 프로그램 실행 시 Too many open files라는 시스템 오류가 발생함.

A. 보안상의 문제로 일반 계정은 시스템 사용한도가 기본 설정되어있음.

다음 명령어로 현재 설정된 자원사용한도를 확인한다.

chamomile@host> ulimit –a … core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7746 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited …

open files, max user processes 항목의 값이 너무 작다면 자원사용한도를 높여주거나 unilmit(제한없음)으로 변경한다.

chamomile@host> vim /etc/security/limits.conf … chamomile soft nproc unlimited chamomile hard nproc unlimited chamomile soft nofile unlimited chamomile hard nofile unlimited …

ProcessException: Process exit value is [137] 에러 발생

Q. 배치 프로그램 실행 시 오류 메시지에 ProcessException: Process exit value is [137] 이라는 메시지만 존재하고 배치프로그램은 에러 처리됨

A. JVM Exit code 137은 OOM(Out Of Memory) 에러로 수행 중이던 배치 프로그램에서 메모리가 부족하여 발생하는 오류이다. 해결 방법은 다음과 같다.

  1. 배치프로그램 commit-interval 조정

    배치 프로그램의 commit-interval이 할당된 메모리 대비 너무 클 경우 발생 할수 있음으로 commit-interval을 적정 수준으로 조정(해당 내용은 데이터베이스 서버에도 영향을 준다.)

  2. spring-batch 실행 옵션의 메모리 사이즈 조정

    배치 실행어플리케이션은 내부 영향을 최소화하기 위해 프로세스 fork로 배치프로그램을 invocation한다.

    그때 spring-batch인 경우 배치 프로그램 실행시 사용되는 JVM 옵션값 관련 설정에서 메모리 설정을 조정한다.

    (최초 설치 시 default option은 -Xms256m -Xmx512m 로 설정되어 있음)

    chamomile@host> vim ./conf/application.xml … <!-- Spring Batch Project Configuration --> <springJobLauncher> <contextFiles>conf/project/project.xml</contextFiles> <javaOpts>-Xms256m -Xmx512m</javaOpts> </springJobLauncher> …
  3. 로그 한글 깨짐

    아래 파일에 태그 옵션에 charset="UTF-8" 부분을 추가한다.

    • spring-batch.log4j2.xml

    • log4j2.xml

    <Console name="consoleAppender" target="SYSTEM_OUT"> <PatternLayout charset="UTF-8" pattern="${CONSOLE_LOG_PATTERN}" disableAnsi="true"/> </Console> <Route key="logFileName"> <RollingFile name="Rolling-${ctx:logFileName}" fileName="log/${ctx:logFileName}.log" filePattern="log/${ctx:logFileName}_%d{yyyyMMdd_HHmmss}_%i.log"> <PatternLayout charset="UTF-8" pattern="${FILE_LOG_PATTERN}"/> <Policies> <!--<SizeBasedTriggeringPolicy size="10 MB" />--> <OnStartupTriggeringPolicy/> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Route>
Last modified: 10 1월 2025