728x90
반응형

AA_B.배치개발_V1.0 참조.
Spring batch 아키텍처 기반.

해당 작성글 목차
1. 개요
1-1 배치 어플리케이션 아키텍처
1-2 배치 어플리케이션 개발순서
2. 어플리케이션 개발 가이드
2-1 배치 Job 정의
//2-2 ChunkTasklet Step 정의
2-2 Tasklet Step 정의
3. 요소 기술별 표준 및 적용 가이드
3-1 트랜잭션 처리
3-2 로그 처리
3-3 Bean Scope 처리
3-4 Exception 처리
3-5 프로퍼티 처리
4. 공통 기능 적용 가이드
4-1 병렬처리
4-2 Exception 발생후의 추가작업
4-3 반복실행

배치 Job 개발시에는 Job Configration(Job XML파일) 과 application Tier 의 개발대상 컴포넌트를 작성한다.

배치 개발시 작성이 필요한 유형
ex)
1. ABPDX0004_JOB.xml
2. BnftX01BTO.java
3. BnftX02BPO.java
4. BnftXDTO.java
5. CviBnftXIDAO.java
6. CviBnftXIDAO_SQL.xml

JOB.xml
, BTO.java
, BPO.java
, DTO.java
, DAO.java
, DAO_SQL.xml

각각의 파일의 역활
:
JOB.xml
Tasklet Step 정의
배치 Job 의 여러가지 쓰임새의 구현에 ChunkTasklet 유형은 복잡함만을 더할 수 있다.
예를 들어 Job의 종료시 운영자에게 통보처리 한다거나, 단일 sql 을 실행하는 경우를 위해 Tasklet Step을 사용한다.
프레임워크는 Tasklet 단위로 트랜잭션을 제어하고,
실행상태를 로깅한다.(ChunkTasklet Step의 경우 Step 실행중 Chunk 단위로 트랜잭션 및 로깅을 수행한다)

Tasklet 정의
다음은 Tasklet을 정의한 예이다.

<job id = "AA999002" xmlns="http://www.springframework.org/schema/batch" parent="baseJob">
<description> Tasklet 유형 Job </description>
<step id = "AA999002_01" parent="baseStep">
<description>적재 DB 초기화 후 DB로드 DB적재 Step</description>
<tasklet ref="tasklet01BTO" />
</step>
</job>

Tasklet의 class 속성으로 BTO구현 bean의 id를 지정한다.

Tasklet bean을 선언한다.
<bean id = "tasklet01BTO" class="......batch.Tasklet01BTO" scope="step">
<property name = "closYm" value ="#{JobParameters['CLOS_YM']}"/>
</bean>

Class 속성으로 BTO 구현체를 지정한다.
Scope 속성을 step으로 지정한ㄷ(Job/Step Scope 처리 참조)


DTO 정의
DTO(Data Transfer Object)는 데이터를 저장하여 사용하는 Java Object 이다.
DTO는 AbstractDTO를 상속하여 정의한다

package...
import....
import ...dto.AbstractDTO;

public class ExmpTotnLDTO extends AbstractDTO{
private String closYm;
Getter/Setter....
}


DAO 정의
DAO는 DB자원에 대한 인터페이스를 제공한다.
시스템의 DB 인터페이스 프레임워크(Mybatis)의 구현 규칙에 따라, SQL 파일 (Mapper XML)과 DAO interface를 작성한다.
1) DAO Interface 정의
DAO 인터페이스를 정의하고, 인터페이스 상단에 Mapper Annotation을 명시하여 Mybatis DAO로 동작할 수 있도록 한다. (Spring-mybatis Framework은 Mapper Interface를 스캔하여 콤포넌트를 생성한다)
Mapper Annotation는 접근하고자 하는 DB 에 따라 아래와 같이 구분되며, Dao는 접근하는 DB에 따라 Class가 분리 되어야 한다.






BO 정의
BO는 여러 프로그램에서 재사용이 필요한 경우에 작성하는 컴포넌트이다 클래스 Annotation으로 @Component 를 지정하여 BTO/BPO에 주입하여 사용한다.
(현 프로젝트에서는 공통에서 사용함)



BTO 정의
BTO는 Chunk 방식이 아닌 배치 Step 을 정의할 수 있다.
BTO는 AbstractBTO를 상속하여 구현한다.

Tasklet 객체의 멤버변수를 선언한다. BO/DAO 등의 공통자원을 @Autowired Annotation을 이용하여 멤버변수에 주입한다.
ex)
private static final Logger logger = LogManager.getLogger(Chunk01BTO.class);

@Autowired
private AacExmpTotnLDAO aacExmpTotnDAO;

private String closYm;

public void setClosYm(String closYM) {
this.closYm = closYm;
}
구현할 오퍼레이션은 executeTasklet 하나이다. 상속한 속성인 jobParameters, jobExecutionContext, stepExecutionContext, readCount, writeCount를 사용할 수 있다.
jobExecutionContext에 추가한 정보는 다음 Step에서 공유할 수 있다.
@Override
public void executeTasklet() throws Exception{
// 전월 구하기
String pmmClosYm = IFRSSDateUtil.addMonth(closYm, -1);
jobExecutionContext.putString("pmmClosYm",pmmClosYm);
//파라미터DTO
ExmpTotnLDTO exmpTotnLDTO = new ExmpTotnLDTO();
exmpTotnLDTO.setClosYm(pmmClosYm);
//배치 Step집계결과 초기화
aacExmpTotnDAO.deleteAacExmpTotnL(exmpTotnLDTO);
List<BatchResult> batchResults = flushStatements();
if(batchResults.size() > 0) {
writeCount = batchResults.get(0).getUpdateCounts()[0];
}
}







3. 요소기술별 표준 및 적용 가이드
3.1 트랜잭션 처리
프레임워크는 선언적 방식으로 트랜잭션을 제어한다. 실행프로그램에서 정상 처리시 commit 되고, catch 되지 않은 Exception 발생시 rollback 처리하며, 프로그램에서 개발자가 트랜잭션을 별도로 처리하지 않는다.
Rollback 이 필요한 경우 프로그럄에서 명시적으로 Exception 을 발생시키도록 개발자가 구현하여야 한다.
ChunkTasklet의 트랜잭션의 경계단위는 Chunk이며, Tasklet의 경우 트랜잭션의 경계단위는 Step이다.

3.2 로그 처리
로그처리는 log4j2 프레임워크를 사용하여 로그를 남긴다.
로그파일의 위치는 globals-{OP-MODE].properties에 정의한 globals.batchlog.filepath 설정을 기본 디렉토리로 사용하며, 하위에 JOB_ID 이름의 폴더에 job execution id를 파일명으로 생성한다.

Log4j2 에서는 다음과 같은 로그 레벨을 제공한다.
debug : 개발환경에서만 출력되어야 할 디버깅 메시지 일 경우에 사용한다. 개발(O), 운영(X)
info : 어플리케이션은 완성은 되었으나 안정화 단계에서 참고해야할 메시지일 경우에 사용한다. 개발(O), 운영(X)
warn : 운영환경에서 어플리케이션이 이상없이 계속 실행될 수 있을 정도의 경고메시지일 경우 사용한다.
개발(O), 운영(O)
error : 운영환경에서 운영자에 의해 확인이 필요한
에러메시지일 경우 사용한다. 개발(O), 운영(O)
fatal : 운영환경에서 어플리케이션이 비정성적으로 종료될 수 있는 치명적인 상황확인이 필요한 경우에 사용한다.
개발(O), 운영(O)
//위는 로그 레벨별 적용 기준임

ex)
Log4j2 는 로그를 남길 문자열에 대한 템플릿기능을 제공한다. 복잡한 문자열 연산이 필요한 경우 문자열의 "+" 연산은 사용하지 않고, {} 파라미터 기능을 활용한다.
private static final Logger Logger = LogManager.getLogger(ChunkXX1BTO.class);

Logger.debug("디버그내용");
Logger.debug("디버그내용 : {}", "실제내용");
Logger.info("정보내용");
Logger.info("정보내용 : {}", "정보내용");
Logger.error("오류내용");
Logger.error"오류내용 : {}", "오류내용");


3.3 Bean Scope 처리
Bean 선언에 scope 속성에 job 또는 step 을 지정할 수 있다. 다음은 scope 속성을 step으로 지정한 예이다.

<bean id = "chunk01BTO" class "xxxxxxx.batch.Chunk01.BTO" scope = "step">
<property name="closYm" value="#{jobParameters['CLOS_YM']}"/>
</bean>
프레임워크는 bean에서 지정한 scope에 따라 객체를 생성한다.
//Scope 이 job이면 job 실행 안에서 bean 의 객체는 유일하다.
//Scope 이 step이면 Step 실행 안에서 bean 의 객체가 유일하다. 따라서 Scope 이 step이면 job 실행 안에서 Step 별로 bean 은 다른 객체를 가진다.

배치 job은 다음 종류의 Context를 scope 별로 제공한다.
1) jobParameters
배치 job 실행시 입력한 파라미터의 context로 실행 중 수정은 불가능하다.
Scope 을 job또는 step 으로 지정하여 접근할 수 있다.
2) jobExecutionContext
3) stepExecutionContext

위 Context 를 접근하기 위해 **SpEL 문법을 사용한다.
다음은 배치 Job 정의 XML 에서 JobParameter를 접근하는 예이다.
<bean id="chunk01XXBTO" class="xxxx.batch.ChunkXX01BTO" scope="step">
<property name="closYm" value="#{jobParameters['CLOS_YM']}"/>
</bean>

다음은 BPO에서 jobParameter를 접근하는 예이다.
public class Chunk02XXXBPO implements ItemProcessor<ExmpTotnLDTO, ExmpTotnLDTO> {

private static final LOgger Logger = LogManager.getLogger(Chunk02XXXBPO.class);

@Value("#{jobParameters['SLEEP_YN']}")
String sleepYn;
}



**SpEL이란?
스프링 표현 언어로써 런타임시에 객체 그래프를 조회하고 조작하는 강력한 표현언어이다.
가장 눈에 띄는 것은 메서드 호출과 기본 문자열 템플릿 기능이다.









728x90
반응형

+ Recent posts