본문 바로가기
개발/spring-batch

[spring-batch] Job 소개하기

by RunAndrew 2021. 9. 24.

잡 소개하기

잡은 처음부터 끝까지 독립적으로 실행 할 수 있는 고유하며 순서가 지정된 여러 스탭의 목록이라고 정의한다.

  • 유일하다: 스프링 배치의 잡은 자바나 XML을 사용해 구성하며, 구성한 내용은 재사용할 수 있다.
  • 순서를 가진 여러 스탭의 목록이다: 모든 스탭을 논리적인 순서대로 실행할 수 있도록 잡을 구성한다.
  • 처음부터 끝까지 실행 가능하다: 배치처리는 어떠한 완료 상태에 도달할 때까지 추가적인 상호작용 없이 실행하는 처리이다. 즉, 잡은 외부 의존성 없이 실행할 수 있는 일련의 스탭이다. 예를 들어 특정 디렉토리 내에 처리할 파일이 수신되기를 세 번째 스탭이 기다리도록 잡을 구성하지 않는다. 대신에 파일이 도착했을 때 잡을 시작한다.
  • 독립적이다: 각 배치 잡은 외부 의존성의 영향을 받지 않고 실행할 수 있어야 한다. 그렇다고 실제 잡이 의존성을 가질 수 없다는 것을 의미하지는 않는다. 잡은 의존성을 관리할 수 있어야 한다. 만약 파일이 없다면 오류를 자연스럽게 처리할 것이며, 파일이 전달될 때까지 기다리지 않는다. 잡의 실행은 스케쥴러와 같은 것이 책임진다. 대신 잡은 자신이 처리하기로 정의된 모든 요소를 제어할 수 있다.

잡의 생명주기

잡의 실행은 잡 러너에서 시작된다 . 잡 러너는 잡의 이름과 여러 파라미터를 받아들여 잡을 실행히키는 역할을 한다.

  • CommandLineRunner: 해당 잡 러너는 스크립트를 이용하거나 명령행에서 직접 잡을 실행할 때 사용한다.
  • JobRegistryBackgroundJobRunner: 스프링을 부트 스트랩해서 기동한 자바 프로세스 내에서 쿼츠나 JMX 후크와 같은 스케쥴러를 사용해 잡을 실행한다면, 스프링이 부트스트랩 될때 실행 가능한 잡을 가지고 있는 JobRegistry를 생성한다. JobRegistryBackgroundJobRunner는 JobRegistry를 생성하는데 사용한다.

이 두개의 러너는 스프링 배치가 제공하는 잡러너다. 별개로 스프링 부트는 JobLauncherCommandLineRunner를 사용해 잡을 시작하는 또다른 방법을 제공한다. CommandLineRunner 구현체는 별도의 구성이 없다면 기본적으로 ApplicationContext에 정의된 Job 타입의 모든 빈을 기동시에 실행한다.

 

사용자가 스프링 배치를 실행할 때 잡 러너를 사용하긴 하지만, 잡 러너는 프레임워크가 제공하는 표준 모듈이 아니다. 실제로는 프레임워크를 실행할 때 실제 진입점은 잡 러너가 아닌 JobLauncher 인터페이스의 구현체이다.

 

스프링 배치는 SimpleJobLauncher라는 단일 JobLauncher만 제공한다.CommandLineJobRunner와 JobLauncherCommandLineRunner 내부에서 사용하는 이 클래스는 요청된 잡을 실행할 때 코어 스프링의 TaskExecutor 인터페이스를 사용한다. 스프링에서 TaskExecutor를 구성하는 방법에 여러가지가 있다는 점을 주목한다. SyncTaskExecutor를 사용한다면 잡은 JobLauncher와 동일한 스레드에서 실행된다. 별도의 스레드에서 잡을 실행하는 또 다른 방식도 있다.

Job, JobInstance, JobExecution 간의 관계

 

 

배치 잡이 실행되면 JobInstance가 생성된다. JobInstance는 잡의 논리적 실행을 나타내며 두가지 항목으로 식별된다. 하나는 잡 이름이고, 다른 하나는 잡에 전달돼 실행시에 사용되는 식별 파라미터다. 잡의 실행과 잡의 실행시도는 다른 개념이다. 예를 들어 매일 실행될 것으로 예상되는 잡이 있을때 잡 구성은 한번만 할 것이다. 그리고 예를 들어 날짜와 같은 매일 새로운 파라미터를 잡에게 전달해 실행함으로써 새로운 JobInstance를 얻을 수 있을것이다. 이 때 각 JobInstance는 성공적으로 완료된 JobExecution이 있다면 완료된 것으로 간주된다.

 

잡 실행을 시도할 때 스프링 배치가 JobInstance의 상태를 어떻게 알아낼까?

이것은 JobRepository가 사용하는 데이터베이스에 BATCH_JOB_INSTANCE 라는 테이블이 있다. 나머지 테이블은 이 테이블을 기반으로 파생된다. JobInstance를 식별할 때 BATCH_JOB_INSTANCE와 BATCH_JOB_EXECUTION_PARAMS 테이블을 사용한다.

 

JobExecution은 잡 실행의 실제 시도를 의미한다. 잡이 처음부터 끝까지 단번에 실행 완료 됐다면 해당 JobInstance와 JobExecution은 단 한번씩만 존재한다. 첫 번째 잡 실행 후 오류 상태로 종료됐다면, 해당 JobInstance를 실행하려고 시도할 때마다 새로운 JobExecution이 생성된다. 이때 JobInstance에는 동일한 식별 파라미터가 전달된다. 스프링 배치가 잡을 실행할 때 생성하는 각 JobExecution은 BATCH_JOB_EXECUTION 테이블의 레코드로 저장된다.또, JobExecution이 실행될 때의 상태는 BATCH_JOB_EXECUTION_CONTEXT 테이블에 저장된다. 잡에 오류가 발생하면 스프링 배치는 이 정보를 이용해 올바른 지점에서부터 다시 잡을 시작할 수 있다.

'개발 > spring-batch' 카테고리의 다른 글

[spring-batch] 잡 파라미터  (0) 2021.09.24
[spring-batch] Job 구성하기  (0) 2021.09.24
[spring-batch] 스프링 배치 아키텍쳐  (0) 2021.09.24