====== 기존 업무 재사용 예제 ====== ===== 개요 ===== 기존 업무를 배치의 ItemReader나 ItemWriter로 사용한 예제이다. 스프링 배치에서 제공하는 Item의 Adapter를 사용하면 XML설정만으로도 기존 업무를 손쉽게 사용할 수 있다. 스프링 배치에서 제공하는 Adapter 중에 ItemReaderAdapter와 PropertyExtractingDelegatingItemWriter클래스를 사용하여 기존 업무를 사용하는 기능을 예제로 제공한다. ===== 설명 ===== ====설정==== ===Job 설정=== == 기존 업무 재사용 예제의 Job 설정파일인 delegatingJob.xml을 확인한다.== 아래의 예제에서는 targetObject로 정의된 기존 업무인 PersonService를 재사용한다. read시에는 targetMethod로 정의된 getData 메소드를 실행하고, write시에는 targetMethod로 정의된 processProcessPerson 메소드를 실행한다. firstName address.city === 클래스 설정=== ==위에서 정의된 기존 업무의 클래스를 확인한다.== ** 주의 ** : 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 클래스의 구조는 [[egovframework:rte2:brte:batch_example:run_junit_Test|배치실행환경 예제 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 수행=== == == 수행방법은 [[egovframework:dev2:tst:test_case#Test Case 실행| JunitTest 실행]]을 참고한다. ==== 결과 확인 ==== === === 콘솔창의 로그를 통해 배치 작업시 기존업무를 재사용한 결과를 확인할 수 있다. {{:egovframework:rte2:brte:batch_example:delegate_output.png|}} ===== 참고자료 ===== * [[http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#reusingExistingServices]]