[스프링] 스프링 배치 - 잡 중복 실행 방지 및 레코드 중복 처리 방지와 재시작 (Restart)

잡 중복 실행 방지와 재시작 기능

스프링 배치는 JobRepository를 사용하여 각각의 잡 실행에 대한 메타데이터를 데이터베이스를 통해 관리한다.

실행 중이거나 정상적으로 실행 완료된 잡들의 중복 실행 방지를 위해서는 잡 실행 이력 관리를 위한 JobRepository 설정이 필수이다.

스프링 배치는 건너뛰기(skip) 횟수 초과나 배치 애플리케이션의 비정상적인 종료로 인해 정상적으로 완료되지 않은 잡을 재시작(restart)할 수 있는 기능을 제공하며 정확하게 이전에 실행이 중단된 부분부터 다시 재개할 수 있게 해준다.

스프링 배치의 잡 재시작 기능을 사용하기 위해서는 마찬가지로 JobRepository 설정이 필수적이다.


실행 컨텍스트를 사용한 레코드(항목) 중복 처리 방지

청크 지향 스텝 실행 도중 잡 실행이 실패할 경우 재시도를 수행할 수 있다. 이 때 이미 처리 완료된 항목이 존재할 수 있으며 이를 다시 처리하는 것은 리소스면에서 비효율적일 수 있다.

상태 저장 속성을 갖게 함으로써 재시작 가능한 ItemReader을 별도로 구성하여 스텝 실행을 중단된 위치부터 다시 시작할 수 있다. 이러한 실패한 잡 재시작 및 중복 처리 방지 처리는 비즈니스 구현에 따라 달라질 것이므로 적절한 시나리오에 맞게 구현하면 된다.

스텝을 처음부터 다시 시작하는 것이 아닌, 실패한 청크 단위부터 재시작하기 위해서는 ItemReader가 배치 메타데이터 중 하나인 스텝 실행 관련 상태 데이터(스텝 실행 컨텍스트, ExecutionContext)를 사용하도록 설정하는 과정이 필요하다.

스텝 실행 도중 어느 항목까지 처리를 완료했는지 실행 컨텍스트인 ExecutionContext에 기록하는 과정, 재시작 시 스텝이 어느 항목까지 처리를 완료했는지에 관한 정보를 ExecutionContext로부터 조회하는 과정이 필요하다.

ItemReader를 재시작 가능하게 만드는 것은 ItemReader가 상태 비저장에서 상태 저장 속성을 갖도록 만드는 것이다.


별도의 상태값을 사용한 레코드 중복 처리 방지

실행 컨텍스트 정보는 JobRepository를 통해 데이터베이스에 저장되며 기본적으로 ItemReader는 상태 저장(stateful)이다.

이미 처리된 레코드(입력 또는 출력된 레코드)를 구별 짓는 별도의 상태값을 사용하는 경우(예: 비즈니스 전용 테이블에 레코드의 배치 처리 여부 컬럼이 존재) ItemReader의 기본적인 상태 저장 특성이 필요하지 않으므로 이를 비활성하여야 한다. 이 시나리오에서는 재시작과 관련이 없는 현재 행 번호(또는 인덱스)와 같은 상태를 저장하지 않는 것이 좋다.

의도적으로 ItemReader가 자신의 상태를 ExecutionContext에 저장하지 않도록 하기 위해 다음과 같이 ItemReadersaveState 속성을 false로 설정한다.

saveState(false)


위와 같이 구성된 ItemReader는 잡이 실행되더라도 스텝 및 잡 실행 관련 데이터를 ExecutionContext에 저장하지 않는다.


참고

Comments