====== MultiDataProcessing ======
===== 개요 =====
배치 수행시 다수의 리소스를 처리하고자 할 경우에는 일반적인 Job설정으로 처리할 수 없다. 전자정부 배치프레임워크에서는 MultiData Processing을 통해 다수의 리소스를 읽어 다수의 결과로 처리하거나 다수의 리소스를 읽어 하나의 결과로 처리하는 기능을 제공한다.
===== 설명 =====
다수(N개)의 리소스를 처리하는 방식은 N->1, N->N으로 구분된다. \\
* MultiResourceItem처리: N개의 대상을 읽은 후, 읽은 개수만큼의 결과물을 만들어낸다.
* CompositeItem처리: N개의 대상을 읽은 후, 하나의 결과물을 만들어낸다.
두 방식을 개념적으로 비교하면 아래와 같다. \\
{{:egovframework:rte2:brte:batch_core:multiresource_vs_composite2.png?670|}}
==== MultiResourceItem 처리 ====
다수의 파일을 대상으로 동일한 유형의 Batch처리를 하고자 할 경우 MultiResourceItemReader를 사용하면 편리하다.\\
예를 들어, 아래와 같이 'file~'로 시작하는 파일명을 가진 파일들에 대해 일괄 변경을 수행하고자 할 경우에도 적용 가능하다.\\
file-1.txt file-2.txt ignored.txt
=== Job 설정 ===
Job수행에 사용되는 Reader및 Writer설정은 일반적인 Job과 동일하다.\\
=== Reader 설정 ===
MultiResourceItemReader를 통해 여러 개의 리소스를 읽어온 다음, 1개의 리소스를 처리하는 Reader에게 데이터처리를 위임한다.\\
이 때, input resource경로에 *를 사용하여 다수의 파일을 처리 가능하다.
=== Writer 설정 ===
MultiResourceItemWriter를 통해 출력파일의 개수를 지정한 다음, 1개의 리소스를 처리하는 Writer에게 데이터처리를 위임한다.
==== CompositeItem처리 ====
스프링 배치에서는 Composite처리와 관련하여 CompositeWriter만을 제공하고 있다. 이에 전자정부 배치프레임워크에서는 CompositeReader를 추가적으로 제공한다.\\
=== 처리 프로세스 ===
CompositeReader의 일반적인 처리 프로세스는 아래와 같다.\\
{{:egovframework:rte2:brte:batch_core:batch_composite_reader.png?670|}}\\
✔ **주의!** CompositeReader는 등록된 모든 Reader로부터 데이터를 한 라인씩 순서대로 읽어와서 배열에 넣어주는 역할까지 수행한다.따라서,Writer를 바로 사용하면 안되고 Processor에서 배열을 읽어서 처리하는 과정이 반드시 필요하다. \\
=== 처리 유형 ===
CompositeReader에는 Reader에서 리소스를 처리해서 Processor로 VO를 전달하는 유형과 Reader자체를 그대로 Processor로 전달하는 유형으로 나뉘며,\\
Processor에서는 전달된 데이터 타입에 맞게 비즈니스 로직을 구현할 수 있다.\\
^ 유형 I - VO(ValueObject)를 Processor에 전달하는 유형 ^ 유형 II - Reader를 Processor에 전달하는 유형 ^
|{{:egovframework:rte2:brte:batch_core:batch_composite_vo.png?620|}}|{{:egovframework:rte2:brte:batch_core:batch_composite_read.png?620|}}|
|
|
|
=== Job 설정 ===
CompositeItem처리를 위한 Job설정은 reader에 compositeItemReader를 설정하고, processor를 지정해야 한다.\\
=== Reader 설정 ===
ComposteItemReader를 설정하기 위해서는 Reader로 사용할 Class, returnType, itemReaderList 항목을 작성해야 한다.\\
✔ CompositeItemReader에서 사용가능한 Class는 총 3개가 존재하며 각 Class별 특징은 다음과 같다.\\
^ 종류 ^ 설명 ^
| EgovCompositeFileReader | FlatFile(FixedLength,Delimited), XMLFile 등 파일처리를 위한 용도로 사용 |
| EgovCompositeCursorReader | JdbcCursorItemReader를 통해 DB리소스 처리를 하고자 할 경우에 사용|
| EgovCompositePagingReader | JdbcPagingItemReader, IbatisPagingItemReader 등 Paging단위로 DB리소스 처리를 하고자 할 경우에 사용|
=== Processor 설정 ===
CompositeItemReader를 통해 넘어온 VO 또는 Reader를 Processor에서 꺼내와서 처리하는 로직을 구현해야 한다.\\
public class FileItemProcessor implements ItemProcessor {
public TargetVO process(EgovCompositeDataProvider eprovider) throws Exception {
Object[] obj = eprovider.getMapItems();
//배열에서 항목을 꺼내오는 로직
CustomerCredit vo1 = (CustomerCredit)obj[0];
CustomerCredit vo2 = (CustomerCredit)obj[1];
//비즈니스 로직 처리 가능
TargetVO vo = new TargetVO();
if(vo1 !=null) {
vo.setId(vo1.getId());
}
if(vo2 != null) {
vo.setName(vo2.getName());
}
return vo;
}
}
✔ **주의!** \\
*배열에서 object를 꺼내오는 순서는 ItemList에 설정한 순서이며, 꺼내올 때 Object의 타입에 주의한다.\\
*Processor에서 Writer로 넘겨줄 VO타입을 작성하는 부분에 주의한다.\\
*ItemReader에서 읽어온 데이터의 길이가 항상 같지는 않기 때문에 읽어온 VO가 null이 아닐 때까지 처리되도록 null체크를 위한 분기문을 넣어준다. \\
*결과 VO는 반드시 1개가 되어야 하므로 위와 같이 처리할 수 없는 비즈니스 로직은 다른 방식으로 처리해야 한다. \\
===== 참고자료 =====
* [[egovframework:rte2:brte:batch_example:composite_item|CompositItem 예제]]
* [[egovframework:rte2:brte:batch_example:multi_resource|MultiResource예제]]
* MultiItemReader[[http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#multiFileInput]]
* CompositeItemWriter[[http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#delegatePatternAndRegistering]]