[오류] 병렬 청크 배치 PK 무결성 문제

Posted by , July 05, 2026
ErrorSpring 배치
Series of오류 모음집

환경설정

  • 개발툴 : 이클립스, BXM
  • Java : 1.7

1. 현상

병렬 청크 배치 실행 중 PK 무결성 오류가 지속적으로 발생하였다. 로그를 확인해 보니 이미 처리된 PK가 반복적으로 INSERT되는 현상이 발생했으며, 동일한 데이터에 대한 INSERT가 수천 번 재시도되었다.

2. 원인

처음에는 커밋 인터벌을 1로 설정했을 때는 문제가 발생하지 않았기 때문에 커밋 인터벌 자체의 문제라고 생각했다. 하지만 실제 원인은 PK 컬럼 누락 데이터로 인한 청크 롤백과 재처리 과정이 함께 발생하면서 나타난 문제였다.

스프링 배치는 일반적으로 성공한 Step이나 Job은 다시 실행하지 않는다. 그러나 중복실행여부(Y) 옵션이 활성화되어 있으면 이전 실행 이력과 관계없이 처음부터 다시 수행한다.

장애 발생 과정

  1. 배치가 정상적으로 데이터를 처리하던 중 PK컬럼값이 누락된 데이터를 조회하였다.
  2. 커밋 인터벌이 50으로 설정되어 있었기 때문에 50건 단위의 청크 처리 중 무결성 오류가 발생했고, 해당 청크 전체가 롤백되었다.
  3. 배치는 실패한 작업을 다시 수행하기 위해 처음부터 데이터를 다시 읽고 INSERT를 수행하였다.
  4. 이 과정에서 이미 DB에 저장되어 있던 데이터까지 다시 INSERT 대상으로 처리되었고, 기존 PK와 충돌하면서 무결성 오류가 연속적으로 발생하였다.

3. 해결

Processor에서 PK 컬럼 값이 없는 데이터는 Writer에서 처리되지 않도록 변경하였다.

💡왜 커밋 인터벌 1에서는 문제가 발생하지 않았는가?

커밋 인터벌을 1로 설정했을 때는 왜 정상적으로 수행되었는지 의문이 생겼다.

커밋 인터벌이 1인 경우에는 데이터 1건을 처리한 후 즉시 커밋이 수행된다. 따라서 PK 컬럼 값이 누락된 데이터를 만나더라도 해당 데이터만 실패 대상으로 처리되고, 이미 정상적으로 처리된 이전 데이터까지 다시 대량으로 재처리하는 상황이 발생하지 않았다.

반면 커밋 인터벌이 50인 경우에는 하나의 청크에 포함된 데이터가 함께 처리되므로 PK 컬럼 누락으로 인해 청크 전체가 롤백되었고 이후 재처리 과정에서 이미 저장된 데이터까지 다시 INSERT를 시도하면서 PK 무결성 오류가 반복적으로 발생하였다.

  • 참조