글

라벨이 스프링 배치인 게시물 표시

JobLauncherTestUtils를 이용한 Spring Batch Test

Spring Batch Test - JobLauncherTestUtils 이번에 스프링 배치 테스트 코드를 작성하던 도중에 고민하던 부분과 해결해보려 알아본 내용을 정리해봤습니다 스프링 배치 Step Flow 테스트 Batch 작업을 진행하다 보면 어느 한 Step에서 특정 조건에 부합하는 경우 Job을 종료해야하는 상황이 있을 수 있습니다. 그런 상황의 예제로 아래와 같은 Job의 마지막 실행일자가 오늘과 같으면 Job을 종료 시키는 소스가 있습니다. checkAlreadyRunJob() 을 보면 Job을 멈추기 위해서 Step의 ExitStauts를 임의로 셋업하여 Job을 멈추는 부분이 있습니다. Configuring for Stop 방법은 아래 링크를 참고했습니다. (xml, java config) https://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#configuringForStop 문제는 if (LocalDate.now().isEqual(lastRunDate)) 의 경우에 테스트 코드를 어떻게 작성하는 것이 좋을까 고민이 되었습니다. 즉, 특정 상황에서의 Step의 흐름을 어떻게 하면 테스트할 수 있을까 알아보았습니다. Step Exit Status가 STOPPED로 세팅되었는지 Step Exit Status(STOPPED)에 따라 Job이 정상 종료하였는지 ... @Bean("userPrintJob") public Job generateMyJob() { return jobBuilderFactory.get("userPrintJob") .start(generateMyTasklet()) .on("STOPPED").end() .on("COMPLETED").to(...

스프링 배치 Step Flow 시나리오

스프링 배치 Step Flow 시나리오 기본적인 Step Flow 스프링 배치 Step의 Flow는 각 Step의 Status에 따라 진행됩니다. 기본적으로 Step이 성공하면 다음 Step으로 넘어가고, Step이 실패하면 Job이 실패합니다. 조금더 복잡한 시나리오로 다뤄보면, Step A가 성공하면 Step B를, 실패하면 Step C를 실행할 수 있습니다. 다음 예시는 방금 언급한 시나리오를 xml 설정으로 나타낸 것입니다. on 속성은 StepExecution의 ExiteStatus와 매칭되는 값이 들어가는데, <next on="*" to="stepB" /> 는 어떤 상태든지 Step B로 이동한다는 의미이고 <next on="FAILED" to="stepC" /> 는 FAILED 상태이면 Step C로 이동한다는 의미다. 이렇게만 보면 무조건 *가 먼저 선언되었으므로 항상 Step B로 이동하나 생각할 수 있는데, 실제로는 스프링 배치가 구체적으로 명시한 것부터 체크하여 FAILED 상태인 경우에는 Step C로 이동하게 됩니다. <job id="job"> <step id="stepA"> <next on="*" to="stepB" /> <next on="FAILED" to="stepC" /> </step> </job> 이보다 더 자세한 Step Flow를 이해하기 위해서는 먼저 스프링 배치의 Job, Step의 Status을 알아보겠습니다. Job과 Step의 Status Batch Status JobExecution과 StepExecution의 속성으로, Job과 Step의 상태를 의미합니...

스프링 배치 Step

스프링 배치 - Step Job에 대한 순차적인 처리 단계를 의미 Step의 구현은 크게 두 가지로, 대부분 Chunk 기반을 수행하도록 구현한다. Chunk 기반일 필요가 없거나 Reader-Processor-Writer의 처리단계를 거쳐야할 필요가 없다면, 별도의 Tasklet을 구현하여 수행할 수있다. Step 구현 Tasklet Tasklet은 Step에서 수행되는 로직을 의미한다. 1. Chunk-Oriented Processing 일반적으로 많이 구현되는 Chunk 기반의 처리를 말한다. 아이템(=데이터)을 하나씩 Read하고 Process한다. 아이템들이 모여, 일정 수의 chunk가 되면(= commit interval에 도달하면) Write하고 트랜잭션이 Commit 된다. 일정 수의 chunk(= commit interval) 개수는 설정할 수 있다. 이처럼 원하는 단위로 트랜잭션을 묶을 수 있기때문에 대용량 데이터 처리를 쉽게 나눠서 처리할 수 있다. 2. Tasklet Step Oriented Processing 개발자가 원하는 Custom Logic을 만들어 배치를 수행하는 방식이다. 트랜잭션 단위가 TaskletStep 단위로 묶이므로, 대용량 데이터 처리를 하나의 트랜잭션에 묶지 않을 거라면 간단히 개발할 수 있다. 재시도와 스킵, 롤백 1. 재시도 retryable-exception-classes 속성으로 예외 클래스들을 정의하고 retry-limit 횟수를 설정하면, 해당 예외가 발생한 경우 지정한 횟수만큼 재시도한다. 2. 스킵 skippable-exception-classes 속성으로 예외 클래스들을 정의하고 skip-limit 횟수를 설정하면, 해당 예외가 발생한 경우 지정한 횟수 만큼 스킵하다가 넘어서면 예외를 전달하고 Step이 실패된다. 3. 롤백 재시도와 스킵을 고려하지 않아서, Writer로 부터 예외가 발...

스프링 배치 기초

스프링 배치 1. 스프링 배치 개념 배치란 무엇인가 데이터를 일정 기간 또는 일정량을 기준으로 묶어서 처리하는 방식 즉, 일괄 처리하는 방식을 말한다. 스프링 배치란 무엇인가 앞서말한 배치 작업을 처리하기위해 필요한 구조와 기능들 스프링에서 제공하는 프레임워크 2. 스프링 배치 기능 배치 작업 모니터링 배치 작업 트랜잭션 관리 배치 작업 통계 정보 제공 배치 작업 시작, 재시작, 건너뛰기 등의 정책 설정 다양한 배치 실행 방법 지원 Quartz, CommandLine, JMX 콘솔, OSGI, 동기/비동기 등등 3. 스프링 배치 주요 개념 Job 하나의 배치 작업을 정의하는 개념 Job Instance Job의 실행에 대한 논리적인 개념을 의미 배치가 실제 실행되면, 각각의 실행을 Instance라고 한다. 예를 들어, 매주 1번씩 실행되는 배치 작업이 있다면 그 매주 실행되는 각각의 배치 작업을 Job Instance라고 한다. 동일한 Job Parameters를 가진 Job Instance는 생성할 수 없다. Job Execution 배치 작업이 실행될 때, 실제로 수행된 Execution을 의미 예를 들어, 월요일 오전마다 수행되는 배치 작업이 있을 때, 첫 번째 배치 작업은 실패하고 두 번째에 재 시도하여 성공했다면, 두 번의 시도는 각각이 다른 Job Execution이고 같은 작업의 시도만 다를 뿐이니 Job Instance는 같다. Job에 대한 실행 결과(Failed, Completed)를 가진다. Job Parameter Job Instance가 실행될 때, 전달되는 파라미터를 의미 Step Job에 대한 순차적인 처리 단계를 의미 Step Execution 한번의 Step 실행 시도를 의미 시작/종료 시간과 상태를...