Spring Batch Chunk Size, Skip/Retry, Listener 구성 시 주의사항 정리

1. Spring Batch에서 Chunk Size 1과 1000의 성능 차이

Chunk Size는 Spring Batch 성능에 직접적인 영향을 주며, 특히 chunk=1chunk=1000은 속도 차이가 큽니다.

  • chunk = 1: 한 건씩 커밋 → 매우 빈번한 DB I/O → 느림
  • chunk = 1000: 1000건 단위 커밋 → I/O 절감 → 빠름

일반적으로는 chunk size를 100 ~ 1000 사이로 설정하는 것이 적절하며, 성능과 메모리 사용량의 균형을 고려해야 합니다.

2. Skip과 Retry를 함께 설정했을 때 우선순위는?

Spring Batch에서는 retry가 우선입니다. 예외가 발생하면 먼저 retry() 조건을 확인하여 재시도하고, 재시도 횟수를 초과하면 skip() 조건에 따라 건너뜁니다.


.faultTolerant()
.skip(Exception.class)
.skipLimit(100)
.retry(ConnectionTimeoutException.class)
.retryLimit(3)

위 설정일 경우 ConnectionTimeoutException은 먼저 3회 재시도한 후 실패 시 skip됩니다.

3. ItemWriter의 write 메서드 내부에서 try-catch 사용 시 예외 재전파 여부

아래처럼 try-catch만 쓰고 catch 블록에서 throw하지 않으면 예외는 자동으로 전파되지 않습니다.


@Override
public void write(Chunk<? extends Object> chunk) throws Exception {
    try {
        // 처리 로직
    } catch (Exception e) {
        log.error("오류 발생", e); // 재던지지 않음 → skip/retry 미적용
    }
}

예외를 Batch에게 인식시키려면 throw e;를 명시적으로 다시 던져야 합니다.

4. ItemProcessListener 상속 및 등록 방법

ItemProcessor 처리 전/후 또는 에러 발생 시점을 감지하려면 ItemProcessListener<I, O>를 구현하면 됩니다.


@Component
public class LoggingListener implements ItemProcessListener&lt;MyInput, MyOutput&gt; {
    public void beforeProcess(MyInput item) { ... }
    public void afterProcess(MyInput item, MyOutput result) { ... }
    public void onProcessError(MyInput item, Exception e) { ... }
}

Step에 등록:


.stepBuilderFactory.get("step")
    .listener(loggingListener)

5. ItemProcessListener에 Object 사용 가능 여부

가능은 하지만 권장되지 않습니다. 타입 안정성이 없고 매번 캐스팅이 필요하므로 유지보수가 어려워집니다.


public class GenericListener implements ItemProcessListener&lt;Object, Object&gt; {
    public void beforeProcess(Object item) { ... }
}

공통 처리 로직이나 여러 타입을 다룰 필요가 있을 때만 Object 사용을 고려하세요.

6. chunk(1_000) 표기는 1인가 1000인가?

Java 7 이상에서는 숫자 가독성을 위해 1_000과 같은 표기가 가능하며, 이는 숫자 1000입니다. 즉, chunk(1_000)chunk(1000)과 동일합니다.


이 포스트는 Spring Batch 설정 시 자주 마주치는 실무 질문들을 기준으로 정리된 가이드입니다. 설정 최적화나 특정 케이스 튜닝이 필요하시면 댓글로 질문 주세요!

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다