Spring Batch로 엑셀 보고서 배치 처리하기: 아키텍처와 구현
Spring Batch는 단일 HTTP 요청 내에서 수백 개의 엑셀 문서를 동기적으로 생성하는 문제를 해결합니다. 이 프레임워크는 프로세스를 청크로 분할하고 상태를 관리하며 실패 시 복구를 보장합니다. 실제 항공기 엔진 수리 자동화 프로젝트에서 이 기능을 활용해 사용자가 작업 카드와 라우팅 시트의 배치 인쇄를 타임아웃 없이 트리거할 수 있었습니다.
Spring Batch의 핵심 구성 요소
Job은 엑셀 생성, 아카이빙, 스토리지 업로드, 정리 작업을 포함한 전체 사이클을 조정합니다. Step은 처리 단계를, Tasklet은 원자적 작업을 의미합니다.
프로세스는 청크 기반 단계(배치 읽기/처리/쓰기)와 태스클릿 기반 단계(단일 작업)로 나뉩니다. 이를 통해 단계 독립성과 중앙 집중식 관리를 보장합니다.
보고서 생성 단계
단계 PRINT: 엑셀 파일 생성
데이터는 10개 항목씩 청크로 분할됩니다. 각 항목은 리더 → 프로세서 → 라이터를 통과합니다:
@Bean
@JobScope
public Step printTrpTagsStep(
ItemReader<TrpTagForPrintModel> excelTrpTagItemReader,
ItemProcessor<TrpTagForPrintModel, ExcelItem> excelTrpTagItemProcessor,
ItemWriter<ExcelItem> excelTrpTagItemWriter
) {
return new StepBuilder(BatchExcelPrintStep.PRINT.getCode(), jobRepository)
.<TrpTagForPrintModel, ExcelItem>chunk(10)
.transactionManager(transactionManager)
.reader(excelTrpTagItemReader)
.processor(excelTrpTagItemProcessor)
.writer(excelTrpTagItemWriter)
.build();
}
Spring Batch는 진행 상황을 추적하기 위해 writeCount를 기록합니다. 파일은 /tmp/engine/{timestamp}/zip/에 문서 유형별 하위 폴더로 저장됩니다.
단계 ZIP: 아카이브 생성
Tasklet이 디렉토리를 스캔하고 표준 Java 유틸리티를 사용해 ZIP 파일을 생성합니다.
단계 UPLOAD: S3 업로드
아카이브를 S3에 업로드하고 링크를 ExecutionContext에 기록합니다.
단계 CLEAN_UP: 임시 데이터 삭제
JobExecutionListener가 상태를 확인하고 성공 또는 실패 시 /tmp 디렉토리를 정리합니다.
동시성 및 확장성
여러 Job이 스레드 풀에서 실행되어 동시 사용자 요청을 처리합니다. Job 내에서는 병렬 단계를 사용하지 않았지만 프레임워크에서 지원합니다.
프론트엔드 통합: 진행 상황 모니터링
POST /trp-tag/print/excel/batch/start는 jobExecutionId를 반환합니다. GET /trp-tag/print/excel/batch/{id}는 상태를 반환합니다.
진행률은 다음과 같이 계산됩니다:
- PRINT: writeCount에 비례(시간의 90%).
- 나머지 단계: 0% 또는 100%.
프론트엔드는 다음을 수신합니다:
- 진행률 표시줄용 progressPercentage.
- currentStepNumber/totalStepsNumber.
- 상태(STARTED/COMPLETED/FAILED).
- downloadUrl.
- failureDetails.
- durationMillis.
구현 이점
- 비동기 처리: 타임아웃 대신 즉각적인 응답.
- 지속성: 추가 인프라 없이 PostgreSQL에 기록 저장.
- 트랜잭션 무결성: @Async와 달리 자동 상태 관리.
핵심 요점
- 청크 크기 10은 메모리 사용량을 최소화하고 진행 상황 추적을 보장합니다.
- WriteCount는 정밀 모니터링을 위한 내장 카운터입니다.
- ExecutionContext는 아티팩트 참조를 저장합니다.
- JobExecutionListener는 정리 작업을 보장합니다.
- 스레드 풀은 여러 Job을 동시에 확장합니다.
Spring Batch는 아카이빙 및 스토리지가 포함된 모든 배치 문서 생성에 적합합니다. 큐를 사용한 맞춤형 로직보다 구현 시간이 적게 소요됩니다.
— Editorial Team
아직 댓글이 없습니다.