Spring Batch Transaction Executor Type 오류

2025. 1. 1. 19:47트러블 슈팅

반응형

최근에 회사에서 Spring-Batch로 개발을 하면서 다음과 같은 오류를 보게되었습니다.

org.springframework.dao.TransientDataAccessResourceException: Cannot change the 
ExecutorType when there is an existing transaction

제가 당시에 사용하던 코드는 아래와 같은 모양이었습니다.

@Bean
public MyBatisPagingItemReader<Model> mybatisPagingItemReader() {
    ...
}

@Bean
public ItemWriter<Model> itemWriter() {
    return (chunk) -> {
        modelMapper.insertModelList(chunk.getItems());
    };
}

@Bean
public Step step() {
    return new StepBuilder("step", jobRepository)
        .chunk(5000, transactionManager)
        .reader(mybatisPagingItemReader())
        .writer(itemWriter())
        .build()
}

문제는 같은 Transaction 내에서 다른 ExecutorType을 사용한다는 것이었습니다.
spring batch 5부터는 step을 생성할 때, transactionManager를 직접 지정해주어 step을 하나의 transaction으로 동작하게 합니다.
MyBatisPagingItemReader에서는 ExecutorType BATCH를 사용하고 일반적으로 우리가 사용하는 SqlSessionTemplate은 Default 설정으로 ExecutorType SIMPLE을 사용하고 있기에 문제가 발생한 것이었습니다.

이를 해결하기 위해 저는 Executor BATCH 타입의 SqlSessionTemplate을 별도로 하나 더 만들어 주었습니다. 참고한 사이트에서는 Mapper에서 Transaction을 분리하거나 적용하지 않는 방법도 소개했는데요. 이는 더 선호한다고 생각되는 방법을 선택하시면 될 것 같습니다.

Spring Batch Executor Type

  • SIMPLE: executor가 별도의 작업을 하지 않음
  • REUSE: prepared statement 재사용
  • BATCH: prepared statement 재사용 & 묶음 갱신

참고 : https://tomining.tistory.com/178

반응형