홈으로 돌아가기

타임아웃 없이 Excel 보고서용 Spring Batch

이 기사는 Spring Batch를 사용한 Excel 보고서 배치의 비동기 생성 구현을 설명합니다. PRINT, ZIP, UPLOAD, CLEAN_UP steps 상세 분석과 코드 예제. 프론트엔드와 진행 상황 통합 및 Thread Pool을 통한 스케일링.

배치 Excel 생성: 프로덕션에서의 Spring Batch
Advertisement 728x90

Spring Batch로 엑셀 보고서 배치 처리하기: 아키텍처와 구현

Spring Batch는 단일 HTTP 요청 내에서 수백 개의 엑셀 문서를 동기적으로 생성하는 문제를 해결합니다. 이 프레임워크는 프로세스를 청크로 분할하고 상태를 관리하며 실패 시 복구를 보장합니다. 실제 항공기 엔진 수리 자동화 프로젝트에서 이 기능을 활용해 사용자가 작업 카드와 라우팅 시트의 배치 인쇄를 타임아웃 없이 트리거할 수 있었습니다.

Spring Batch의 핵심 구성 요소

Job은 엑셀 생성, 아카이빙, 스토리지 업로드, 정리 작업을 포함한 전체 사이클을 조정합니다. Step은 처리 단계를, Tasklet은 원자적 작업을 의미합니다.

프로세스는 청크 기반 단계(배치 읽기/처리/쓰기)와 태스클릿 기반 단계(단일 작업)로 나뉩니다. 이를 통해 단계 독립성과 중앙 집중식 관리를 보장합니다.

Google AdInline article slot

보고서 생성 단계

단계 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 파일을 생성합니다.

Google AdInline article slot

단계 UPLOAD: S3 업로드

아카이브를 S3에 업로드하고 링크를 ExecutionContext에 기록합니다.

단계 CLEAN_UP: 임시 데이터 삭제

JobExecutionListener가 상태를 확인하고 성공 또는 실패 시 /tmp 디렉토리를 정리합니다.

동시성 및 확장성

여러 Job이 스레드 풀에서 실행되어 동시 사용자 요청을 처리합니다. Job 내에서는 병렬 단계를 사용하지 않았지만 프레임워크에서 지원합니다.

Google AdInline article slot

프론트엔드 통합: 진행 상황 모니터링

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

Advertisement 728x90

다음 읽기