Job의 라이프사이클을 이해하는 것은 잡을 구조화하고 실행 시에 발생하는 상황을 이해하는 데 중요하다. 잡을 정의할 때 실제로 하는 일은 잡과 관련된 청사진을 제공하는 것이다. 자바 클래스 코드 작성이 JVM에서 인스턴스를 생성하는 청사진을 정의하는 일인 것처럼 잡을 정의하는 것은 스프링 배치가 잡의 인스턴스를 생성하는데 필요한 일종의 청사진이다.
잡 실행은 job runner에서 시작한다. job runner는 잡 이름과 여러 파라미터를 받아들여 잡을 실행시킨다. 스프링 배치는 두 가지 잡 러너를 제공한다.
- CommandLineJobRunner:
- 이 잡 러너는 스크립트를 이용하거나 명령행에서 직접 잡을 실행할 때 사용한다. CommandLineRunner는 스프링을 부트스트랩하고, 전달받은 파라미터를 사용해 요청된 잡을 실행한다.
- JobRegistryBackgroundJobRunner:
- 스프링을 부트스트랩해서 기동한 자바 프로세스 내에서 Quartz 또는 JMX 후크와 같은 스케줄러를 사용해 잡을 실행한다면 스프링이 부트스트랩될 때 실행 가능한 잡을 가지고 있는 JobRegistry를 생성한다. JobRegistryBackgroundJobRunner는 JobRegistry를 생성하는 데 사용한다.
CommandLineRunner 와 JobRegistryBackgroundJobRunner 는 스프링 배치가 제공하는 두 개의 잡 러너다. 이와 별개로 스프링부트는 JobLauncherCommandLineRunner 를 사용해 잡을 시작하는 또 다른 방법을 제공한다. 이 CommandLineRunner 구현체는 별도의 구성이 없다면 기본적으로 ApplicationContext 에 정의된 Job 타입 모든 빈을 기동 시에 실행한다.
사용자가 스프링 배치를 실행할 때 잡 러너를 사용하긴 하지만, 잡 러너는 프레임워크가 제공하는 표준 모듈이 아니다. 또 각 시나리오마다 서로 다른 구현체가 필요하기 때문에 프레임워크가 JobRunner 라는 인터페이스를 별도로 제공하지는 않는다. 실제로 프레임워크를 실행할 때 실제 진입점은 잡 러너가 아닌 org.springframework.batch.core.launch.JobLauncher 인터페이스 구현체다.
스프링 배치는 org.springframework.batch.core.launch.support.SimpleJobLauncher 라는 단일 JobLauncher 만을 제공한다. ComandLineJobRunner 와 JobLauncherCommandLineRunner 내부에서 사용하는 이 클래스는 요청된 잡을 실행할 때 코어 스프링의 TaskExecutor 인터페이스를 사용한다.
스프링에서 org.springframework.core.task.TaskExecutor 를 구성하는 방법에 여러가지가 있다.
org.springframework.core.task.SyncTaskExecutor 를 사용한다면 잡은 JobLauncher 와 동일한 스레드에서 실행된다. 별도의 스레드에서 잡을 실행하는 또 다른 방식도 있다.
배치 잡이 실행되면 org.springframework.batch.core.JobInstance 가 생성된다. JobInstance 는 잡의 논리적 실행을 나타내며, 두 가지 항목으로 식별되는데, 하나는 잡 이름이고 하나는 잡에 전달되어 실행 시에 사용되는 식별 파라미터(잡 파라미터)다. 잡의 실행과 잡의 실행 시도는 다른 개념이다. 예를 들어 매일 실행될 것으로 예상되는 잡이 있을 때 잡 구성은 한 번만 할 것이다. 그리고 매일 새로운 파라미터를 잡에게 전달해 실행함으로써 JobInstance 를 얻을 수 있을 것이다. 이때 각각 JobInstance 는 성공적으로 완료된 JobExecution 이 있다면 완료된 것으로 간주된다.
노트 JobInstance는 한 번 성공적으로 완료되면 다시 실행시킬 수 없다. JobInstance는 잡 이름과 전달된 식별 파라미터로 식별되므로, 동일한 식별 파라미터를 사용하는 잡은 한 번만 실행할 수 있다.
잡 실행을 시도할 때 스프링 배치가 JobInstance 의 상태를 JobRepostiroy 가 사용하는 데이터베이스에 BATCH_JOB_INSTANCE 라는 테이블에 저장한다. 그래서 스프링 배치가 JobInstance 상태를 확인할 수 있는 것이다. 나머지 테이블은 이 테이블을 기반으로 파생된다. JobInstance 를 식별할 때는 BATCH_JOB_INSTANCE 와 BATCH_JOB_EXECUTION_PARAMS 테이블을 사용한다.
JobExecution 은 잡 실행의 실제 시도를 의미한다. 잡이 처음부터 끝까지 단번에 실행 완료되었다면 해당 JobInstance 와 JobExecution 은 단 하나씩만 존재한다. 첫 번째 잡 실행 후 오류 상태로 종료되었다면 해당 JobInstance 를 실행하려고 시도할 때마다 새로운 JobExecution 이 생성된다. 이때 JobInstance 에는 동일한 식별 파라미터가 전달된다. 스프링 배치가 잡을 실행할 때 생성하는 각 JobExecution 은 BATCH_JOB_EXECUTION 테이블의 레코드로 저장된다. 또, JobExecution 이 실행될 때 상태는 BATCH_JOB_EXECUTION_CONTEXT 테이블에 저장된다. 잡에서 오류가 발생하면 스프링 배치는 이 정보를 이용해 올바른 지점에서부터 다시 잡을 시작할 수 있다.
'Study > Spring Batch' 카테고리의 다른 글
Spring Batch 기본 개념 (0) | 2022.01.21 |
---|