기존 업무 재사용 예제

개요

기존 업무를 배치의 ItemReader나 ItemWriter로 사용한 예제이다. 스프링 배치에서 제공하는 Item의 Adapter를 사용하면 XML설정만으로도 기존 업무를 손쉽게 사용할 수 있다. 스프링 배치에서 제공하는 Adapter 중에 ItemReaderAdapter와 PropertyExtractingDelegatingItemWriter클래스를 사용하여 기존 업무를 사용하는 기능을 예제로 제공한다.

설명

설정

Job 설정

기존 업무 재사용 예제의 Job 설정파일인 delegatingJob.xml을 확인한다.

아래의 예제에서는 targetObject로 정의된 기존 업무인 PersonService를 재사용한다. read시에는 targetMethod로 정의된 getData 메소드를 실행하고, write시에는 targetMethod로 정의된 processProcessPerson 메소드를 실행한다.

<bean id="reader" class="org.springframework.batch.item.adapter.ItemReaderAdapter">
       <property name="targetObject" ref="delegateObject" />
       <property name="targetMethod" value="getData" />
</bean>
<bean id="writer" class="org.springframework.batch.item.adapter.PropertyExtractingDelegatingItemWriter">
       <property name="targetObject" ref="delegateObject" />
       <property name="targetMethod" value="processPerson" />
       <property name="fieldsUsedAsTargetMethodArguments">
		<list>
			<value>firstName</value>
			<value>address.city</value>
		</list>
	</property>
</bean>
<bean id="delegateObject" class="egovframework.brte.sample.common.domain.person.PersonService" />

클래스 설정

위에서 정의된 기존 업무의 클래스를 확인한다.

주의 : reader의 역할을 하는 targetMethod는 다음과 같은 ItemReader의 동작방식을 만족해야 한다.

✔ 메소드 호출시 하나의 Item(Object)을 반환한다.
✔ 더 이상 반환할 Item(Object)이 없는 경우 null을 반환한다.

//reader의 역할을 하는  getData() 호출시 generatedCounter가 1씩 증가하며 하나의 person이라는 Object를 반환한다. 
//또한  읽기 횟수에 제한을 두어 null을 반환하여 더이상 반환한 Item이 없다는 것을 알린다.
 
public class PersonService {
 
	private static final int GENERATION_LIMIT = 10;
 
	private int generatedCounter = 0;
	...
 
        //read
	public Person getData() {
		if (generatedCounter >= GENERATION_LIMIT)
			return null;
 
		Person person = new Person();
               ...
		generatedCounter++;
 
        return person;
        }
 
        //write
        public void processPerson(String name, String city) {
	        processedCounter++;
	}
}

JunitTest 구성 및 수행

JunitTest 구성

기존 업무 재사용 예제를 수행하고 배치작업 결과에 대한 검증을 위해 다음과 같이 @Test를 구성하였다.

✔ JunitTest 클래스의 구조는 배치실행환경 예제 Junit Test 설명을 참고한다.
✔ assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()) : 배치수행결과가 COMPLETED 인지 확인한다.
✔ assertTrue(personService.getReturnedCount() > 0), assertEquals(personService.getReturnedCount(), personService.getReceivedCount()) :기존 업무재사용 여부를 확인한다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/egovframework/batch/simple-job-launcher-context.xml", "/egovframework/batch/jobs/delegatingJob.xml", "/egovframework/batch/job-runner-context.xml" })
public class EgovDelegatingJobFunctionalTests {
 
	//배치작업을  test하기 위한 JobLauncherTestUtils
	@Autowired
	private JobLauncherTestUtils jobLauncherTestUtils;
    //배치작업에 사용된 기존 업무 클래스
	@Autowired
	private PersonService personService;
 
	/**
	 * 배치작업 테스트
	 */
	@Test
	public void testLaunchJob() throws Exception {
 
		JobExecution jobExecution = jobLauncherTestUtils.launchJob();
		assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
		assertTrue(personService.getReturnedCount() > 0);
		assertEquals(personService.getReturnedCount(), personService.getReceivedCount());
		System.out.println(">>>>>>>>> readCount = "+personService.getReturnedCount());
		System.out.println(">>>>>>>>> writeCount = "+personService.getReceivedCount());
	}
 
}

JunitTest 수행

수행방법은 JunitTest 실행을 참고한다.

결과 확인

콘솔창의 로그를 통해 배치 작업시 기존업무를 재사용한 결과를 확인할 수 있다.

참고자료

 
egovframework/rte2/brte/batch_example/job_reuse.txt · 마지막 수정: 2023/12/21 05:21 (외부 편집기)
 
이 위키의 내용은 다음의 라이센스에 따릅니다 :CC Attribution-Noncommercial-Share Alike 3.0 Unported
전자정부 표준프레임워크 라이센스(바로가기)

전자정부 표준프레임워크 활용의 안정성 보장을 위해 위험성을 지속적으로 모니터링하고 있으나, 오픈소스의 특성상 문제가 발생할 수 있습니다.
전자정부 표준프레임워크는 Apache 2.0 라이선스를 따르고 있는 오픈소스 프로그램입니다. Apache 2.0 라이선스에 따라 표준프레임워크를 활용하여 발생된 업무중단, 컴퓨터 고장 또는 오동작으로 인한 손해 등에 대해서 책임이 없습니다.
Recent changes RSS feed CC Attribution-Noncommercial-Share Alike 3.0 Unported Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki