잡 Job
- 잡은 흐름과 유사하다. 잡을 처음부터 끝까지 독립적으로 실행할 수 있는 고유하며 순서가 지정된 여러 스텝의 목록이라고 정의할 수 있다.
- 잡의 실행은 잡 러너 (Job Runner) 에 의해 시작된다. 잡 러너는 잡 이름과 여러 파라미터를 받아들여 잡을 실행시키는 역할을 한다. 스프링 배치는 두 가지 잡 러너를 제공한다.
- CommandLineJobRunner : 스크립트를 이용하거나 명령형에서 직접 잡을 실행할 때
- JobRegistryBackgroundJobRunner : 자바 프로세스 내에서 Quartz (쿼츠) 나 JMX 후크와 같은 스케줄러를 사용해 잡을 실행한다면, 스프링이 부트스트랩될 때 가능한 잡을 가지고 있는 JobRegistry 를 생성한다. 즉 JobRegistryBackgroundJobRunner 는 JobRegistry 를 생성하는 데 사용한다.
추가적으로
- JobLauncherCommandLineRunner : 스프링 부트가 제공하는 잡을 시작하는 또 다른 방법으로 별도의 ConmmandLineRuuner 구성이 없다면 기본적으로 ApplicationContext 에 정의된 Job 타입의 모든 빈을 기동 시에 실행한다.
- 허나, 실제 프레임워크를 실행할 때 진입점은 잡 러너가 아닌 JobLauncher 인터페이스의 구현체다. 스프링 배치는 SimpleJobLauncher 라는 단일 JobLauncher 만 제공한다. CommandLineJobRunner 와 JobLauncherCommandLineRunner 내부에서 사용하는 이 클래스는 요청된 잡을 실행할 때 코어 스프링의 TaskExecutor 인터페이스를 사용한다.
JobInstance 는 잡의 논리적 실행을 나타내며, 한 번 성공적으로 완료되면 다시 실행시킬 수 없다. JobInstance 는 잡 이름과 전달된 식별 파라미터로 식별되므로, 동일한 식별 파라미터를 사용하는 잡은 JobRepository 가 사용하는 BATCH_JOB_INSTANCE 라는 테이블과 비교해 한 번만 실행할 수 있다.
JobExecution 은 잡 실행의 실제 시도를 의미한다. 잡이 처음부터 끝까지 단번에 실행 완료됐다면 해당 JobInstance 와 JobExecution 은 단 하나씩만 존재한다. JobExecution 은 BATCH_JOB_EXECITION 테이블의 레코드로 저장된다. 또 JobExecution 이 실행될 때의 상태는 BATCH_JOB_EXECUTION_CONTEXT 테이블에 저장된다.
잡 파라미터 JobParameter
- JobInstance 는 잡 이름 및 잡에 전달된 식별 파라미터로 식별된다. 동일한 식별 파라미터를 사용해 동일한 잡을 두 번 이상 실행할 수 없다.
- 잡에 전달된 파라미터를 확인하는 방법으로, JobRepository 의 데이터베이스 스키마에는 BATCH_JOB_EXECUTION_PARAMS 테이블이 있다.
- 잡 파라미터 접근하기
- ChunkContext : 태스크릿을 보면 execute 메서드가 두 개의 파라미터를 전달받는 것을 볼 수 있다. 첫 번째 파라미터는 StepContribution 으로, 아직 커밋되지 않은 현재 트랜잭션에 대한 정보(쓰기 수, 읽기 수 등)를 가지고 있다. 두 번째 파라미터는 ChunkContext 인스턴스다. 이 인스턴스는 실행 시점의 잡 상태를 제공한다. 또한 태스크릿 내에서는 처리 중인 청크와 관련된 정보도 갖고 있다. 해당 청크 정보는 스텝 및 잡과 관련된 정보도 갖고 있다. ChunkContext 에는 JobParameters 가 포함된 StepContext 의 참조가 있다.
- 늦은 바인딩 : JobParameters 는 변경할 수 없으므로 부트스트랩 시에 바인딩하는 것이 좋다. 이는 늦은 바인딩을 활용하는 것으로 늦은 바인딩으로 구성될 빈은 스텝이나 잡 스코프를 가져야 한다. 이때 스코프 각각의 기능은 스텝의 실행 범위(스텝 스코프) 나 잡의 실행 범위(잡 스코프) 에 들어갈 때까지 빈 생성을 지연시키는 것이다.
spring batch scope 참고 블로그
파라미터 유효성 검증
- JobParametersValidator 인터페이스를 구현하고 해당 구현체를 잡 내에 구성하면 된다.
- 스프링 부트에서는 필수 파라미터가 누락없이 전달됐는지 확인하는 유효성 검증기인 DefaultJobParametersValidator 를 기본적으로 제공한다. DefaultJobParametersValidator 에는 requiredKeys 와 optionalKeys 라는 두 가지 선택적인 의존성이 있다. 둘 다 문자열 배열로써 파라미터 이름 목록이 담기는데, 각각 필수 파라미터 목록과 필수가 아닌 파라미터 목록을 의미한다.
- 유효성 검증기 구성에 사용하는 JobBuilder 의 메서드는 하나의 JobParameterValidator 인스턴스만 지정하게 되어 있지만, CompositeJobParametersValidator 를 사용하면 두 개의 유효성 검증기를 사용할 수 있도록 구성이 가능하다.
잡 파라미터 증가시키기
- JobParametersIncrementer 는 잡에서 사용할 파라미터를 고유하게 생성할 수 있도록 스프링 배치가 제공하는 인터페이스이다. 매 실행 시에 타임스템프를 추가할 수도 있다.
- 기본적으로 파라미터 이름이 'run.id' 인 long 타입 파라미터의 값을 증가시킨다. (스프링 배치 프레임워크가 제공하는 RunIdIncrementer 또한 있다.)
- 만약 타임스탬프를 파라미터로 사용하거나 커스텀을 필요로 한다면 JobParametersIncrementer 를 implements 받아 직접 구현해 주면 된다.
잡 리스너 적용하기
- 잡 실행과 관련이 있다면 JobExecutionListener 를 사용할 수 있다. 이 인터페이스는 befaoreJob 과 afterJob의 두 메서드를 제공한다.
- 스프링 배치는 리스너 용도로 사용하는 @BeforeJob 과 @AfterJob 애너테이션을 제공한다. 애너테이션을 사용하면 구성 방법이 약간 달라지는데, 스프링 배치에서 이 리스너를 잡에 주입하려면 래핑을 해야 한다. 이때 JobListenerFactoryBean 을 사용한다.
ExecutionContext
- JobExecution 은 상태를 저장하는 여러 곳 중에서 한곳이다. JobExecution 은 잡이나 스텝이 진행될 때 변경된다. 잡 상태는 JobExecution 의 ExecutionContext 에 저장된다.
- ExecutionContext 는 기본적으로 배치 잡의 세션이다. ExecutionContext 는 간단한 키-값 쌍을 보관하는 도구에 불과하나, 잡의 상태를 안전하게 보관하는 방법을 제공한다.
- ExecutionContext 는 JobExecution 또는 StepExecution 의 일부분이다. ExecutionContext 를 사용하려면 JobExecution 또는 StepExecution 에서 가져와야한다.
'Batch' 카테고리의 다른 글
Spring Batch 를 Jenkins 를 이용해 간단하게 사용해보자 (0) | 2022.07.08 |
---|---|
Spring Batch A 부터 Z 까지 (0) | 2022.07.08 |
Quartz 사용해보기 (0) | 2022.04.25 |
Job 실습해보기 (0) | 2022.04.05 |
스프링 배치 스텝 Step (0) | 2022.04.04 |