Published on

스프링 배치 테스트와 운영

Authors
  • avatar
    Name
    ywj9811
    Twitter

Spring Batch Test - 테스트

@SpringBatchTest 어노테이션

자동으로 ApplicationContext에 테스트에 필요한 여러 유틸 Bean을 등록해주는 어노테이션이다.

  • JobLauncherTestUtils
    • setJob() 을 통해 Job을 자동 주입 받을 수 있으나 한가지만 받을 수 있다.
    • launchJob(), launchStep() 과 같이 스프링 배치 테스트에 필요한 유틸성 메소드 지원
  • JobRepositoryTestUtils
    • JobRepository를 사용하여 JobExecution을 생성 및 삭제하는 기능 메소드 지원
  • StepScopeTestExecutitionListener
    • @StepScope 컨텍스트를 생성해주며 해당 컨텍스트를 통해 JobParameter등을 단위 테스트에서 DI받을 수 있다.
  • JobScopeTestExecutionListener
    • @JobScope 컨텍스트를 생성해주며 해당 컨텍스트를 통해 JobParameter등을 단위 테스트에서 DI 받을 수 있다.
@Configuration
@EnableBatchProcessing
@EnableAutoConfiguration
public class TestBatchConfig {
}

@ExtendWith(SpringExtension.class)
@SpringBatchTest
@SpringBootTest(classes = {JobConfig.class, TestBatchConfig.class})
public class BatchTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @AfterEach
    public void clear() {
        jdbcTemplate.execute("delete from customer2");
    }

    @Test
    public void jobTest() throws Exception {
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("name", "user1")
                .addLocalDateTime("date", LocalDateTime.now())
                .toJobParameters();

        JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);
        assertThat(jobExecution.getStatus())
                .isEqualTo(BatchStatus.COMPLETED);
        assertThat(jobExecution.getExitStatus())
                .isEqualTo(ExitStatus.COMPLETED);
    }
}

이를 통해서 간단하게 테스트를 해볼 수 있다.

@Configuration
@EnableBatchProcessing
@EnableAutoConfiguration

위의 것들은 배치 환경을 자동 설정하는 것인데,

테스트 환경에서도 필요하기 때문에 별도의 설정에서 작성한다.

(모든 테스트 클래스에서 선언하는 불편함을 없애기 위함)

위의 테스트 에서는 jobExecution 을 사용해서 job의 결과만 확인했지만,

(StepExecution) ((List) jobExecution.getStepExecutions()).get(0); 와 같이 stepExecution 을 추출하여 테스트를 수행하는 것 또한 가능하다.

JobExplorer / JobRegistry / JobOperation - 운영

JobExplorer

  • JobRepository의 readOnly 버전으로 실행중인 Job의 실행 정보인 JobExecution 또는 Step의 실행 정보인 StepExecution을 조회할 수 있다.
Untitled

JobRegistry

  • 생성된 Job을 자동으로 등록, 추적, 관리하며 여러 곳에서 Job을 생성한 경우 ApplicationContext에서 Job을 수집해서 사용할 수 있다.
  • 기본 구현체로 Map기반의 MapJobRegistry를 제공하며 JobName을 Key로 Job을 Value로 매핑한다.
  • Job등록
    • JobRegistryBeanPostProcessor - BeanPostProcessor 단계에서 bean초기화 시 자동으로 JobRegistry에 Job을 등록시켜준다.
Untitled

JobOperation

  • JobExplorer, JobRepository, JobRegistry, JobLauncher를 포함하여 배치의 중단, 재시작, job 요약 등의 모니터링이 가능하다.
  • 기본 구현체로 SimpleJobOperator 를 제공한다.
Untitled