ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 배치 도메인 이해 -JobRepository
    Study/Spring Batch 2024. 2. 29. 06:48

    JobRepository

    1) 기본 개념

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

    2) 구조

     

    3) JobRepository 메서드

    • JobInstance 가 존재하는지 여부
      • boolean isJobInstanceExists(String jobName, JobParameters jobParameters)
    • Job 이 실행될 때 마다 JobExecution 생성
      • JobExecution createJobExecution(String jobName, JobParameters jobParameters)
    • 해당 Job의 실행 이력 중 가장 최근의 JobExecutioin 반환
      • JobExecution getLastJobExecution(String jobName, JobParameters jobParameters)
    • Job 의 실행정보 업데이트
      • void update(JobExecution jobExecution)
    • Step 의 실행정보 업데이트
      • void update(StepExecution stepExecution)
    • 실행 중인 해당 Step 의 새로운 stepExecution 저장
      • void add(StepExecution stepExecution)
    • Step 의 공유데이터 및 상태정보를 담고 있는 ExecutionContext 업데이트
      • void updateExecutionContext(StepExecution stepExecution)
    • Job 의 공유데이터 및 상태정보를 담고 있는 ExecutionContext 업데이트
      • void updateExecutionContext(JobExecution jobExecution)
    • 해당 Step의 실행 이력 중 가장 최근의 StepExecutioin 반환
      • StepExecution getLastStepExecution(JobInstance jobInstance, String stepName)

     

    4) JobRepository 설정

    EnableBatchProcessing 어노테이션만 선언하면 JobRepository가 자동으로 빈으로 생선된다.

    BatchConfigurer 인터페이스를 구현하거나 BasicBatchConfigurer를 상속해서 JobRepository 설정을 커스터마이징 할 수 있다.

    • JDBC 방식으로 설정 : JobRepositoryFactoryBean
      • 내부적으로 AOP 기술을 통해 트랜잭션 처리
      • 트랜잭선 isolation의 기본 값은 SERIALIZEBLE로 최고 수준. 다른 레벨(READ_COMMITED, REPEATABLE_READ)로 지정 가능
        • 배치는 많은 트래픽이 동시 접근하는 구조가 아니므로 엄격한 수준으로 isolation을 설정하더라도 괜찮다.
      • 메타테이블의 Table Prefix를 변경할 수 있음. 기본값은 "BATCH_"
    @Override
    protected JobRepository createJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(transactionManager);
        factory.setIsolationLevelForCreate("ISOLATION_SERIALIZABLE"); // isolation 수준, 기본값은 “ISOLATION_SERIALIZABLE”
        factory.setTablePrefix(“SYSTEM_"); // 테이블 Prefix, 기본값은 “BATCH_”, BATCH_JOB_EXECUTION 가 SYSTEM_JOB_EXECUTION 으로 변경됨
        factory.setMaxVarCharLength(1000); // varchar 최대 길이(기본값 2500)
        return factory.getObject(); // Proxy 객체가 생성됨 (트랜잭션 Advice 적용 등을 위해 AOP 기술 적용)
    }
    • In Memory 방식으로 설정 : MapJobRepositoryFactoryBean
      • 성능 등의 이유로 도메인 오브젝트를 굳이 데이터베이스에 저장하고 싶지 않은 경우
      • 보통 Test나 프로토타입의 빠른 개발이 필요할 때 사용
    @Override
    protected JobRepository createJobRepository() throws Exception {
        MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
        factory.setTransactionManager(transactionManager); // ResourcelessTransactionManager 사용
        return factory.getObject();
    }

     

    댓글

Designed by Tistory.