강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

박세용님의 프로필 이미지
박세용

작성한 질문수

Spring Batch Job 단위 트랜잭션

작성

·

62

0

안녕하세요, 현재 스프링 배치 5를 활용하여 배치 프로그램 설계를 하는 중입니다~

설계를 하면서 스프링 배치의 구조에 대해서 알아보니 기본적으로 Transaction은 chunk단위로 걸리기 때문에 chunk가 끝날 때마다 commit이 발생한다고 하더라구요!

 

1) Job 하위의 어느 하나라도 Step이 실패하면 모든 Step이 롤백

2) 처리할 데이터가 많아 Chunk 단위로 나누어서 처리

3) 테스트 코드 작성, 관심사 분리 등의 이유로 하나의 Tasklet으로 모으는 것 지양

 

위와 같은 제약 사항이 있어서

chunk단위의 트랜잭션을 무시하고 job단위에 트랜잭션을 걸어서 1번 제약사항을 해결하고 싶은데 검색한 방법들이 잘 적용이 되지 않아 혹시 경험과 지식이 많으신 선배님에게 좋은 방법이 있는 지 질문 드리게 되었습니다ㅜㅜ

 

감사합니다..!

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
박세용님께서 질문 주신 내용을 바탕으로 답변 드리겠습니다.

스프링 배치에서 기본적으로 사용하는 chunk 기반의 트랜잭션 처리 대신에, job 단위의 트랜잭션을 적용하기 위해서는 몇 가지 옵션을 고려할 수 있습니다. 스프링 배치에서는 트랜잭션 관리가 주로 chunk 단위로 이루어지지만, job 단위의 트랜잭션을 구현하려면 전체 배치를 위한 커스텀 트랜잭션 관리를 설정해야 합니다.

  1. 트랜잭션 관리자를 커스터마이징:
    스프링 배치의 StepExecutionListener와 JobExecutionListener를 활용하여 각 Step의 결과를 확인하고, 모든 Step이 성공적으로 완료되었을 때만 최종적으로 데이터를 커밋하는 방식을 고려할 수 있습니다.

  2. JTA 트랜잭션 사용:
    JTA를 이용하여 분산 트랜잭션을 사용하면 여러 Step 간의 트랜잭션을 보다 쉽게 관리할 수 있습니다. 이 경우, 각 Step은 각각의 트랜잭션 컨텍스트에서 실행되며 최종 job의 결과에 따라 개별 Step의 트랜잭션을 커밋하거나 롤백할 수 있습니다. Spring Boot의 JTA 지원을 활용하면 더욱 효율적으로 구현할 수 있습니다.

  3. JobExecution 예외 핸들링:
    job level에서 트랜잭션 실패 시 전체 Step을 롤백하도록 구현이 필요할 수 있습니다. 이는 ‘JobExecution’ 상태를 점검하여 실패 시에 적절한 롤백 처리를 설계하는 방법입니다.

이 방법들이 도움이 되길 바랍니다. 추가로 궁금한 사항이 있으면 언제든지 질문해 주세요.
감사합니다.

박세용님의 프로필 이미지
박세용

작성한 질문수

질문하기