개발놀이터

스프링 배치 도메인 이해 : JobRepository, JobLauncher 본문

Spring/Spring Batch

스프링 배치 도메인 이해 : JobRepository, JobLauncher

마늘냄새폴폴 2022. 9. 24. 00:14

본 포스팅은 인프런의 정수원님의 스프링 배치 강의를 듣고 정리한 포스팅입니다. 더 자세한 내용은 강의를 참고해주세요. 

 

 

JobRepository

기본 개념

  • 배치 작업 중의 정보를 저장하는 저장소 역할
  • Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 meta data를 저장함
    • JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리함

JobRepository는 JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다고 했는데 구체적으로 어떤 내용을 처리하는 걸까요?

 

우선 JobLauncher에서는 job_name과 job_parameter를 가지고 JobInstance를 조회해봅니다. 그리고 조회가 된다면 (중복되는 JobInstance가 있다면) 에러를 던져버리죠, 또한 JobExecution을 조회할 때도 마찬가지입니다. 

 

 Job에서는 JobInstance, JobExecution, JobExecutionContext 등을 조회하고 저장하는 데 JobRepository가 사용됩니다. Stiep에서도 마찬가지로 StepExecution, StepExecutionContext 등을 조회하고 저장하는 데 사용됩니다.

 

JobInstance, JobExecution, JobExecutionContext, StepExecution, StepExecutionContext 에 대한 내용은 이전 포스팅을 참고해주세요. 해당 포스팅에선 위의 내용을 다루지 않습니다. 

 

 

JobRepository 설정

  • @EnableBatchProcessing 어노테이션만 선언하면 JobRepository 가 자동으로 빈으로 생성됨
  • BatchConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer 를 상속해서 JobRepository 설정을 커스터마이징 할 수 있다. 
    • JDBC 방식으로 설정 - JobRepositoryFactoryBean
      • 내부적으로 AOP 기술을 통해 트랜잭션 처리를 해주고 있음
      • 트랜잭션 isolation 의 기본값은 SERIALIZEBLE로 최고 수준, 다른 레벨로 지정 가능
      • 메타 테이블의 Table Prefix 를 변경할 수 있음, 기본 값은 "BATCH"
  • In Memory 방식으로 설정 - MapJobRepositoryFactoryBean
    • 성능 등의 이유로 도메인 오브젝트를 굳이 데이터베이스에 저장하고 싶지 않을 경우
    • 보통 Test나 프로토타입의 빠른 개발이 필요할 때 사용

 

 

JobLauncher

기본 개념

  • 배치 Job을 실행시키는 역할을 한다.
  • Job과 JobParameters를 인자로 받으며 요청된 배치 작업을 수행한 후 최종 client 에게 JobExecution을 반환함
  • 스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동 생성된다.
  • Job 실행
    • JobLauncher.run(Job, JobParameters)
    • 스프링 부트 배치에서는 JobLauncherApplicationRunner 가 자동적으로 JobLauncher를 실행시킨다.
    • 동기적 실행
      • taskExecutor 를 SyncTaskExecutor 로 설정할 경우 (기본 값은 SyncTaskExecutor)
      • JobExecution 을 획득하고 배치 처리를 최종 완료한 이후 Client 에게 JobExecution을 반환
      • 스케줄러에 의한 배치처리에 적합 함 - 배치 처리 시간이 길어도 상관없는 경우
    • 비 동기적 실행
      • taskExecutor 가 SimpleAsyncTaskExecutor 로 설정할 경우
      • JobExecution을 획득한 후 Client 에게 바로 JobExecution을 반환하고 배치처리를 완료한다.
      • HTTP; 요청에 의한 배치처리에 적합함 - 배치처리 시간이 길 경우 응답이 늦어지지 않도록 함

 

기본 개념에서 중요하게 봐야할 부분은 바로 동기적 비동기적 실행입니다. 

 

위에서도 언급되어있지만 동기적 실행은 JobExecution을 획득하고 배치 처리를 최종 완료한 이후 Client 에게 JobExecution을 반환합니다. 비동기적 실행은 JobExecution을 반환하고 배치 처리를 완료하죠.

 

순서의 문제입니다. 그럼 이 둘의 차이는 무엇일까요?

 

바로 배치 처리 시간입니다. 배치 처리 시간이 긴 경우 동기적 실행을 하는 것이 적합하고 배치 처리 시간이 길어도 응답이 늦어지지 않도록 하기 위해서는 비동기적 실행이 적합합니다. 

 

이 둘의 차이에 대해 글로만 설명하면 이해하기 힘들 것입니다. 그래서 도식화해서 보도록 하겠습니다. 

 

이렇게 보시면 좀 더 이해하기 편할 것입니다. 

 

이렇게 JobRepository와 JobLauncher에 대해서 알아봤습니다. 다음 포스팅에선 @JobScope, @StepScope에 대해 깊게 공부해보는 시간을 갖도록 하겠습니다.