플랫 파일의 데이터를 구분자(delimiter)로 구분하여 처리하는 기능을 예제로 제공한다. 스프링 배치에서는 플랫 파일을 처리하기 위해 FlatFileItemReader와 FlatFileItemWriter를 제공한다.
FlatFileItemReader는 아래와 같은 설정들을 포함한다.
<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <property name="lineMapper"> <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <property name="lineTokenizer"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <property name="delimiter" value=","/> <property name="names" value="name,credit" /> </bean> </property> <property name="fieldSetMapper"> <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <property name="targetType" value="egovframework.brte.sample.common.domain.trade.CustomerCredit" /> </bean> </property> </bean> </property> <property name="resource" value="#{jobParameters[inputFile]}" /> </bean>
추가로 FlatFileItemWriter설정에 대해서 설명하면 아래와 같다.
<bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> <property name="resource" value="#{jobParameters[outputFile]}" /> <property name="lineAggregator"> <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> <property name="delimiter" value=","/> <property name="fieldExtractor"> <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor"> <property name="names" value="name,credit"/> </bean> </property> </bean> </property> </bean>
✔ JunitTest 클래스의 구조는 배치실행환경 예제 Junit Test 설명을 참고한다.
✔ getUniqueJobParameters에서 JobParameter에 쿼리에 필요한 파라미터 정보를 넘긴다.
✔ EgovAbstractIoSampleTests에서 배치작업을 수행하고 배치작업 전후의 데이터를 비교확인한다.
✔ assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()): 배치수행결과가 COMPLETED 인지 확인한다.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/egovframework/batch/jobs/delimitedIoJob.xml") public class EgovDelimitedFunctionalTests extends EgovAbstractIoSampleTests { ... @Override protected JobParameters getUniqueJobParameters() { return new JobParametersBuilder(super.getUniqueJobParameters()).addString("inputFile", "/egovframework/data/input/delimited.csv").addString("outputFile", "file:./target/test-outputs/delimitedOutput.csv").toJobParameters(); } }
@ContextConfiguration(locations = { "/egovframework/batch/simple-job-launcher-context.xml", "/egovframework/batch/job-runner-context.xml"}) @TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class }) public abstract class EgovAbstractIoSampleTests { //배치작업을 test하기 위한 JobLauncherTestUtils @Autowired @Qualifier("jobLauncherTestUtils") private JobLauncherTestUtils jobLauncherTestUtils; //배치작업의 reader @Autowired private ItemReader<CustomerCredit> reader; /** * 배치작업 테스트 */ @Test public void testUpdateCredit() throws Exception { open(reader); List<CustomerCredit> inputs = getCredits(reader); close(reader); JobExecution jobExecution = jobLauncherTestUtils.launchJob(getUniqueJobParameters()); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); pointReaderToOutput(reader); open(reader); List<CustomerCredit> outputs = getCredits(reader); close(reader); assertEquals(inputs.size(), outputs.size()); int itemCount = inputs.size(); assertTrue(itemCount > 0); for (int i = 0; i < itemCount; i++) { assertEquals(inputs.get(i).getCredit().add(CustomerCreditIncreaseProcessor.FIXED_AMOUNT).intValue(), outputs.get(i).getCredit().intValue()); } } ... }
수행방법은 JunitTest 실행을 참고한다.