[스프링] 스프링 배치 - 잡 중복 실행 방지 및 레코드 중복 처리 방지와 재시작 (Restart)
잡 중복 실행 방지와 재시작 기능
스프링 배치는 JobRepository
를 사용하여 각각의 잡 실행에 대한 메타데이터를 데이터베이스를 통해 관리한다.
실행 중이거나 정상적으로 실행 완료된 잡들의 중복 실행 방지를 위해서는 잡 실행 이력 관리를 위한 JobRepository
설정이 필수이다.
스프링 배치는 건너뛰기(skip) 횟수 초과나 배치 애플리케이션의 비정상적인 종료로 인해 정상적으로 완료되지 않은 잡을 재시작(restart)할 수 있는 기능을 제공하며 정확하게 이전에 실행이 중단된 부분부터 다시 재개할 수 있게 해준다.
스프링 배치의 잡 재시작 기능을 사용하기 위해서는 마찬가지로 JobRepository
설정이 필수적이다.
실행 컨텍스트를 사용한 레코드(항목) 중복 처리 방지
청크 지향 스텝 실행 도중 잡 실행이 실패할 경우 재시도를 수행할 수 있다. 이 때 이미 처리 완료된 항목이 존재할 수 있으며 이를 다시 처리하는 것은 리소스면에서 비효율적일 수 있다.
상태 저장 속성을 갖게 함으로써 재시작 가능한 ItemReader
을 별도로 구성하여 스텝 실행을 중단된 위치부터 다시 시작할 수 있다. 이러한 실패한 잡 재시작 및 중복 처리 방지 처리는 비즈니스 구현에 따라 달라질 것이므로 적절한 시나리오에 맞게 구현하면 된다.
스텝을 처음부터 다시 시작하는 것이 아닌, 실패한 청크 단위부터 재시작하기 위해서는 ItemReader
가 배치 메타데이터 중 하나인 스텝 실행 관련 상태 데이터(스텝 실행 컨텍스트, ExecutionContext
)를 사용하도록 설정하는 과정이 필요하다.
스텝 실행 도중 어느 항목까지 처리를 완료했는지 실행 컨텍스트인 ExecutionContext
에 기록하는 과정, 재시작 시 스텝이 어느 항목까지 처리를 완료했는지에 관한 정보를 ExecutionContext
로부터 조회하는 과정이 필요하다.
ItemReader
를 재시작 가능하게 만드는 것은 ItemReader
가 상태 비저장에서 상태 저장 속성을 갖도록 만드는 것이다.
별도의 상태값을 사용한 레코드 중복 처리 방지
실행 컨텍스트 정보는 JobRepository
를 통해 데이터베이스에 저장되며 기본적으로 ItemReader
는 상태 저장(stateful)이다.
이미 처리된 레코드(입력 또는 출력된 레코드)를 구별 짓는 별도의 상태값을 사용하는 경우(예: 비즈니스 전용 테이블에 레코드의 배치 처리 여부 컬럼이 존재) ItemReader
의 기본적인 상태 저장 특성이 필요하지 않으므로 이를 비활성하여야 한다. 이 시나리오에서는 재시작과 관련이 없는 현재 행 번호(또는 인덱스)와 같은 상태를 저장하지 않는 것이 좋다.
의도적으로 ItemReader
가 자신의 상태를 ExecutionContext
에 저장하지 않도록 하기 위해 다음과 같이 ItemReader
의 saveState
속성을 false
로 설정한다.
saveState(false)
위와 같이 구성된 ItemReader
는 잡이 실행되더라도 스텝 및 잡 실행 관련 데이터를 ExecutionContext
에 저장하지 않는다.
Comments