spring batch complex big multine – zhwan’s dev spring-batch 주요 개발 항목 CSV 파일 포맷 및 처리 전략 예제 환경

spring-batch

spring-batchspring의 sub project로서 ETL관련 수많은 API를 제공하고 있다.

장비에서 발생하는 데이터 파일(CSV포맷)을 파싱하여, DB 적재 프로그래밍을 수행하면서 spring-batch를 이용하였다.

이를 수행 하면서, 겪었던 일을 정리한다.

주요 개발 항목

spring-batch에서 제공하는 API 중 FlatFileItemReader를 이용해 CSV파일을 읽어 드렸고, 데이터 적재는
ItemWriter를 직접 구현하였다.

spring-batchJob 관리를 JobRepository를 통해서 하는데, 내 업무 환경에서는 단타성으로 많은 파일 처리를 해야 해서, MapJobRepositoryFactoryBean을 이용하였다. 주의 점은
clear() 메소드를 호출해야 한다는 점이다. 않그러면, OOME 가 발생한다.

중요한 부분은 ItemReader를 구현하는 것이었는데,
이 부분은 AggregateItemReader를 참고하여 개발 하였다.

CSV 파일 포맷 및 처리 전략

주요 정보는 제거하였다. 예제이므로 데이터 포맷 역시 간략화 하였다.
아래는 파일 데이터 이다.

HEADER_BEGIN
MACHINE_TYPE:HELLO
MACHINE_ID:HELLO001
FILE_CREATED_TIME:2016/11/11 11:11:11
HEADER_END

MATERIAL_DATA_BEGIN
MATERIAL_ID,RECIPE_ID,ITEM1,ITEM2,ITEM3
SPRING_BATCH_MULTILINE_000001,SPRING_BATCH,,,
MATERIAL_DATA_END

MACHINE_MATERIAL_DATA_BEGIN
MACHINE_ID,MATERIAL_ID,START_TIME,END_TIME,ITEM1,ITEM2,ITEM3
HELLO001,SPRING_BATCH_MULTILINE_000001,2016/11/11 11:00:00,2016/06/02 11:11:10,,,
MACHINE_MATERIAL_DATA_END

DEFECT_DATA_BEGIN
MATERIAL_ID,X,Y,JUDGE
SPRING_BATCH_MULTILINE_000001,-735.329,914.988,G
SPRING_BATCH_MULTILINE_000001,-735.329,914.988,G
SPRING_BATCH_MULTILINE_000001,-735.329,914.988,G
SPRING_BATCH_MULTILINE_000001,-735.329,914.988,G
...
DEFECT_DATA_END

데이터는 XXX_BEGIN, XXX_END내에 존재 하고 있다. 각 컨텐츠는 CRLF로 구분 되어 있다.
각 컨텐츠에는 컨텐츠에 대한 헤더 정보가 있고, 그 하단에 정보가 있다.
DEFECT_DATA 같은 경우는 수십만건이 있다.

특히, DEFECT data 경우는 상위에 있는, 자재, 장비 정보와 함께 Dataabase에 관리 되어야 한다.
이 처리를 위해 ItemWriter에서, StepExecution 객체 내부 ExecutionContext 에 자재, 장비 정보를 관리 하였다.

BEGIN, END로 감싸져 있는 정보 처리를 위해 Aggretation 하기 위한 Holder를 사용하였고, OOME 방지를 위해,
1000건씩 처리 하였다. Job 관련 spring-batch 설정 정보를 보면 commit interval이 1로 설정 되어 있다.
즉, BEGIN, END 쌍으로 처리를 하겠다는 것이고, 내부 데이터가 많을 경우를 대비하여, 1000건씩 처리를 하겠다는 의도 이다.

예제 환경

OS : Linux
JVM : JAVA 1.8
Spring : spring-boot (1.4.2)

소스