2021. 4. 12. 17:22ㆍspring
가. DB 준비
스프링배치는 실행결과, 실행중 상태를 보존하기 위해 DB를 사용한다.
ㄱ. dbms 종류 확인 (Postgres, Oracle 등)
ㄴ. SpringBatch jar의 내부를 검색 (/org/springframework/batch/core/)
schema-*.sql 파일을 찾았다면 파일내 기술되어 있는 create table 문을 이용해서 DB에 테이블 생성.
주의점) EXIT_MESSAGE 컬럼의 경우 2500 바이트로 되어 있기 때문에 부족하다면 늘려주는게 좋을 수 있다.
EXIT_MESSAGE 컬럼에는 exception 발생시의 stack trace 문자열을 저장하는 데 이용된다.
스택 트레이스 문자열이 너무 길어서 에러가 되는 경우가 종종 있어서 다음과 같은 조치가 필요.
- 컬럼 사이즈를 3000정도로 늘려준다.
- 컬럼사이즈를 넘는 경우, 컬럼사이즈까지 잘라서 등록하게 하는 방법이 있다. 다음과 같이 설정.
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" p:maxVarCharLength="2000" />
나. SpringBatch 설정
ㄱ. dataSource 와 transactionManager는 DB환경에 맞춰 기술
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/batch
http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator"
p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"
p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" />
<bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean"
p:dataSource-ref="dataSource" />
<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry"/>
</bean>
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"
p:maxVarCharLength="2000"
p:isolationLevelForCreate="ISOLATION_SERIALIZABLE" />
<!-- DB設定 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="XXX.driver" />
<property name="url" value="jdbc.XXX.url" />
<property name="username" value="XXX" />
<property name="password" value="XXX" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
ㄴ. Bean 설정의 간단 설명
bean 명 | bean 역할 | |
jobOperator | Job을 실행하기 위한 오브젝트. 코맨드 라인에서 CommandLineJobRunner를 이용해서 실행하는 경우에는 특별히 필요 없다. Java code 상에서 Job을 실행하기 위해서 이용. Job name(String)을 인수로 전달하여 실행하면 된다. 비슷한 기능으로 jobLauncher가 있다. 또한 코맨드라인에서의 옵션지정(-restart 등) 과 같은 것도 똑같이 가능 | |
jobExplorer | jobExecution을 DB에서 취득하기 위한 오브젝트. 이 오브젝트는 JobRepository 를 통해 DB에 access 한다. 실행한 Job의 실행ID등도 취득 가능. | |
jobLauncher | Job을 실행하기 위한 오브젝트. jobOperator와 달리 Job오브젝트를 인수로 전달해서 실행한다. 또한 코맨라인에서의 옵션지정은 불가능. | |
jobRepository | DB에 접속하기위한 중개자로 SpringBatch용의 테이블에 액세스한다. JobExecution의 쓰기, 읽기가 이루어진다. 설정상의 주의점으로, isolationLevelForCreate가 초기설정값으로 SERIALIZABLE로 되어 있다. 복수 동시접속이 어렵게 되어 있다. ISOLATION READ_COMMITTED 또는 ISOLATION_REPEATABLE_READ 등의 설정이 무난. p:databaseType 설정하지 않으면 spring batch가 dataSource의 접속정보에서 자동으로 DB종류(Oracle 등)를 예상하여 설정한다. 이것도 가능하면 설정해 주는게 좋다. DB종류의 설정의 LOB 형의 조작법의 차이를 커버하기위해 필요. |
다. 단위테스트 또는 개발중 테스트를 위한 DB 설정
- 실행 시 마다의 실행결과가 DB에 저장되기 때문에 반복적인 단위테스트 시 개발을 어렵게 할 수 있다.
-next 기동옵션을 거는 방법도 있겠지만 다음과 같은 방법으로 회피하자.
ㄱ. HSQLDB와 같은 인메모리DB를 이용하는 방법
- 배치 Job 실행이 종료되면 실행결과가 클리어 되어, 재실행할때마다 job name, job parameter등을 신경쓰지 않아도 된다.
- DataSourceInitializer를 이용하면 스프링 기동시 마다 create table 하는게 가능.
[Spring 설정파일]
<!-- 테스트용 DB의 설정 (HSQL) 프로퍼티 설정 읽기-->
<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:/test/batch.properties" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="order" value="1" />
</bean>
<!-- Initialize the datasource - remove this bean definition for production use! -->
<bean id="dataSourceInitializer" class="test.DataSourceInitializer" destroy-method="destroy">
<property name="dataSource" ref="dataSource"/>
<property name="initScripts">
<list>
<value>classpath:${batch.schema.script}</value>
</list>
</property>
<property name="destroyScripts">
<list>
<value>classpath:${batch.schema.dropscript}</value>
</list>
</property>
</bean>
[배치 프로퍼티파일]
# Placeholders batch.*
# for HSQLDB:
batch.jdbc.driver=org.hsqldb.jdbcDriver
batch.jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true
batch.jdbc.user=sa
batch.jdbc.password=
batch.schema=
batch.schema.script=org/springframework/batch/core/schema-hsqldb.sql
batch.schema.dropscript=org/springframework/batch/core/schema-drop-hsqldb.sql
스프링 기동시 HSQDB에 테이블을 자동으로 생성한다.
종료시에는 drop table을 실행하므로 Junit 등 연속으로 실행하는 경우에는 주의가 필요하다.
타이밍에 따라 Job의 실행이 끝나지 않은 상황에서 테이블이 삭제되는 경우가 있으므로 이러한 경우에는 destroyScripts 프로퍼티 설정을 삭제할 필요가 있다.
ㄴ. 온메모리 repository를 이용하는 방법
다음과 같은 설정을 하여 db를 이용하지 않고 메모리만을 이용한다.
[Spring 설정파일]
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"
p:transactionManager-ref="transactionManager" />
<!-- 더미설정ー -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource" />
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
주의점)
- 멀티 쓰레드는 대응하지 않고 있어 병행처리를 하고 싶은경우에는 사용할 수 없다.
- 테스트용이어서 운용에서는 사용해선 안된다.
'spring' 카테고리의 다른 글
07. spring batch - 배치 처리의 실제 샘플 (chunk: db 읽기) (0) | 2021.04.14 |
---|---|
06. spring batch - 스프링 배치 처리 샘플 (chunk 처리 : 파일 읽기) (0) | 2021.04.13 |
04. Spring Batch 기본개념 (ExecutionContext) (0) | 2021.04.12 |
03. Spring Batch 기본개념 (기동, 기동 옵션) (0) | 2021.04.12 |
02. Spring Batch 기본개념 (JobInstance) (0) | 2021.04.12 |