배치 처리는 특성상 상태를 가지고 있다.
ExecutionContext 는 기본적으로 배치 잡의 세션이다.
알아두어야 할 점은 잡을 다루는 과정에서 실제로 여러 개의 ExecutionContext가 존재할 수 있다는 점이다.
JobExecution처럼 각 StepExecution도 마찬가지로 ExecutionContext를 가진다.
이렇게 함으로써 적절한 수준(개별 스텝용 데이터 또는 잡 전체용 글로벌 데이터)으로 데이터 사용 범위를 지정할 수 있다.
ExecutionContext는 데이터를 저장하는 “안전한” 방법을 제공한다. ExecutionContext가 담고 있는 모든 것이 JobRepository에 저장되므로 안전하다.
StepExecution의 Execution Context에 있는 키를 JobExecution의 ExecutionContext로 승격
이는 스텝 간에 공유할 데어터가 있지만 첫 번째 스텝이 성공했을 때만 공유하게 하고 싶을 때 유용하다.
Tasklet
인터페이스를 사용해 개발자는 Tasklet.execute()
메서드가 RepeatStatus.FINISHED
를 반환할 때까지 트랜잭션 범위 내에서 반복적으로 실행되는 코드 블록을 만들 수 있다.청크 기반 스텝은 최소한 2~3개의 주요 컴포 넌트(ItemReader, 필수는 아닌 ItemProcessor, ItemWriter)로 구성된다.
스프링 배치는 이러한 컴포넌트를 사용해 레코드를 청크 또는 레코드 그룹 단위로 처리한다.
각 청크는 자체 트랜잭션으로 실행되며, 처리에 실패했다면 마지막으로 성공한 트랜잭션 이후부터 다시 시작할 수 있다.
ItemReader는 청크 단위로 처리할 모든 레코드를 반복적으로 메모리로 읽어온다.
두 번째 루프는 ItemProcessor에서 일어난다. 필수 구성 요소는 아니지만 ItemProcessor를 구성했다면, 메모리로 읽어들인 아이템은 반복적으로 Item Processor를 거쳐간다.
마지막으로 한 번에 기록할 수 있는 ItemWriter를 호출하면서 모든 아이템을 전달한다. ItemWriter의 단일 호출은 물리적 쓰기를 일괄적으로 처리함으로써 I/O 최적화를 이룬다.
첫번째, Tasklet 인터페이스의 execute 메서드를 구현하는 방법
RepeatStatus.CONTINUABLE
은 스프링 배치에게 해 당 태스크릿을 다시 실행하라고 말하는 것이다.두번째, CallableTaskletAdapter 구현
세번째, MethodlnvokingTaskletAdapter 구현
이 구현체를사용하면 기존에 존재하던 다른클래스 내의 메서드를 잡 내의 태스크릿처럼 실행할수 있다.
예를들어 배치 잡내에서 한번만 실행하고 싶은 로직을 어떤 서비스가 이미 갖고 있다고 가정해보자.
해당 메서드 호출을 래핑할 뿐인 Tasklet 인터페이스의 구현체를 만드는 대신, MethodinvokingTaskletAdapter를 사용해 해당 메서드를 호출할 수 있다.
단점
네번째, SystemCommandTasklet
SystemCommandTasklet을 사용하면 시스템 명령 실행 시, 영향을 줄 수 있는 여러 파라미터를 구성할 수 있다.