====== CompositItem 예제====== ===== 개요 ===== 서로 다른 유형으로 업무 처리하는 예제로 스프링 배치에서는 CompositeItemProcessor와 CompositeItemWriter를 제공한다. CompositeItemWriter를 사용하여 서로 다른 타입의 writer로 업무를 처리하는 기능을 예제로 제공한다. ===== 설명 ===== ====설정==== ===Job 설정=== == CompositeItem 예제의 Job 설정파일인 compositeItemWriterSampleJob.xml을 확인한다.== CompositeItemWriter는 Item을 delegetes으로 정의된 writer에게 각각 전달하여 처리하도록 한다. 아래의 예제에서는 tradeDao, fileItemWriter1, fileItemWriter2 총 3개의 writer로 설정되어 있다. ✔CompositeItemWriter 사용시에는 step에 delegetes으로 정의된 writer들은 streams로 설정하여야 한다. ==== JunitTest 구성 및 수행 ==== === JunitTest 구성 === ==CompositeItem 설정과 관련 클래스들로 Junit Test를 수행한다. 이 때 배치가 수행되고, 관련된 내용을 확인할 수 있다.== ✔ JunitTest 클래스의 구조는 [[egovframework:rte2:brte:batch_example:run_junit_Test|배치실행환경 예제 Junit Test 설명]]을 참고한다. \\ ✔ assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode()) : 배치수행결과가 COMPLETED 인지 확인한다. \\ ✔ checkOutputFile,checkOutputTable 메소드: 배치 수행후 compositeItemWriter에 설정된 writer들이 배치를 실행하였는지 확인한다. @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/egovframework/batch/simple-job-launcher-context.xml", "/egovframework/batch/jobs/compositeItemWriterSampleJob.xml", "/egovframework/batch/job-runner-context.xml" }) public class EgovCompositeItemWriterSampleFunctionalTests { //Trade 테이블의 데이트를 가져오는 쿼리 private static final String GET_TRADES = "SELECT isin, quantity, price, customer FROM TRADE order by isin"; //파일에 예상되는 결과값 private static final String EXPECTED_OUTPUT_FILE = "Trade: [isin=UK21341EAH41,quantity=211,price=31.11,customer=customer1]" + "Trade: [isin=UK21341EAH42,quantity=212,price=32.11,customer=customer2]" + "Trade: [isin=UK21341EAH43,quantity=213,price=33.11,customer=customer3]" + "Trade: [isin=UK21341EAH44,quantity=214,price=34.11,customer=customer4]" + "Trade: [isin=UK21341EAH45,quantity=215,price=35.11,customer=customer5]"; ... @Test public void testJobLaunch() throws Exception { int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from TRADE"); JobExecution jobExecution =jobLauncherTestUtils.launchJob(); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); checkOutputFile("target/test-outputs/CustomerReport1.txt"); checkOutputFile("target/test-outputs/CustomerReport2.txt"); checkOutputTable(before); } /** * 배치작업 후 Trade 테이블의 데이터 확인 * @param 배치작업 전 Trade의 데이터 갯수 */ private void checkOutputTable(int before) { final List trades = new ArrayList() { { add(new Trade("UK21341EAH41", 211, new BigDecimal("31.11"), "customer1")); add(new Trade("UK21341EAH42", 212, new BigDecimal("32.11"), "customer2")); add(new Trade("UK21341EAH43", 213, new BigDecimal("33.11"), "customer3")); add(new Trade("UK21341EAH44", 214, new BigDecimal("34.11"), "customer4")); add(new Trade("UK21341EAH45", 215, new BigDecimal("35.11"), "customer5")); } }; int after = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from TRADE"); assertEquals(before + 5, after); simpleJdbcTemplate.getJdbcOperations().query(GET_TRADES, new RowCallbackHandler() { private int activeRow = 0; public void processRow(ResultSet rs) throws SQLException { Trade trade = trades.get(activeRow++); assertEquals(trade.getIsin(), rs.getString(1)); assertEquals(trade.getQuantity(), rs.getLong(2)); assertEquals(trade.getPrice(), rs.getBigDecimal(3)); assertEquals(trade.getCustomer(), rs.getString(4)); } }); } /** * 배치작업 후 file의 데이터 확인 * @param fileName * @throws IOException */ private void checkOutputFile(String fileName) throws IOException { @SuppressWarnings("unchecked") List outputLines = IOUtils.readLines(new FileInputStream(fileName)); String output = ""; for (String line : outputLines) { output += line; } assertEquals(EXPECTED_OUTPUT_FILE, output); } } ===JunitTest 수행=== == == 수행방법은 [[egovframework:dev2:tst:test_case#Test Case 실행| JunitTest 실행]]을 참고한다. ==== 결과 확인 ==== == == 위의 테스트의 결과인 DB의 Trade테이블과 파일들이 생성되었는지를 확인한다. {{:egovframework:rte2:brte:batch_example:compositewriter_datadb.png|}} {{:egovframework:rte2:brte:batch_example:compositewriter_datafile.png|}} ===== 참고자료 ===== * [[egovframework:rte2:brte:batch_core:multidata_process]] * [[http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#delegatePatternAndRegistering]]