예전에 Spring Batch 사용하면서 jobParameters를 주입받으려면 이렇게 하세요 하고 글을 쓴적이 있다. Spring Batch jobParameters 사용하는 방법 (with @JobScope, @StepScope) Spring Batch에서 실행할때 넘겨주는 Parameter 값을 받아서 동적으로 처리를 하고 싶은 경우가 있다. Springboot Batch에서는 이렇게 Program Arguments를 이용해 jobParameters를 전달한다. 바로 이 값을 어떻.. oingdaddy.tistory.com 이 글은 @JobScope와 @StepScope를 적절하게 사용해야 한다는 내용이 주된 내용이었다. 하지만 어느 프로젝트에서는 위와 같은 규칙을 잘 지켰는데도 불구하고 주입을 받..
일전에 springboot base에서 File to DB Spring Batch 에 대한 예제를 포스팅했었다. 이번에는 DB to File Spring Batch에 대한 예제를 살펴보도록 하겠다. 대략적인 시나리오는 DB로부터 내용을 읽어서(JdbcCursorItemReader) 이 내용을 가공하고(Processor) File을 만들어(FlatFileItemWriter) 주는 시나리오이다. 간단한 테스트를 위해 H2 DB를 사용했으며 springboot의 version은 2.4.x이다. 그 외에 Spring Batch에 대한 기본 설정(datasource 등)은 되어 있어야 한다. H2 DB 삽입내용 INSERT INTO `BATCH_SAMPLE_EMPLOYEE` (`USER_ID`, `USER_NAM..
일전에 Spring Batch가 수행을 하다가 실패를 해도 Jenkins에서는 SUCCESS를 찍는 문제가 있다고 글을 쓴적이 있다. Jenkins Log Parser 사용해서 Application 오류 처리하기 엄청나게 편리한 Jenkins이지만 불편한점도 있다. 예를 들자면 Jenkins를 이용해 batch를 처리할때 분명 batch job은 내가 원하는대로 수행되지 않고 Error가 발생했는데 Jenkins job은 이를 Success 처리를 하 oingdaddy.tistory.com 이런 글인데 이것은 어플리케이션을 수행하고 성공이든 실패든 Jenkins의 Job은 SUCCESS로 출력을 하는데 이 과정의 로그를 분석하여 Jenkins의 Job의 상태를 변경해주는 방법이었다. 어떻게 보면 원칙적인..
Spring Batch에서 실행할때 넘겨주는 Parameter 값을 받아서 동적으로 처리를 하고 싶은 경우가 있다. Springboot Batch에서는 이렇게 Program Arguments를 이용해 jobParameters를 전달한다. 바로 이 값을 어떻게 Batch 코드에서 받을수 있을까에 대한 이야기를 해보려 한다. jobParameters도 기본적으로 값을 받을때 @Value("#{jobParameters[testKey]}") 이런 형식으로 값을 받아야한다. 그냥 코드에 딸랑 저것만 넣으면 안된다. 이걸 사용할 수 있게 해주는것이 바로 @StepScope, @JobScope이다. 이것의 뜻은 Step 실행시점에 bean이 생성이 되는것, 혹은 Job 실행시점에 bean이 생성이 되는것이다. 지난번..
Spring Batch의 기본적인 기능들을 지난 포스팅들을 통해 알아보았다. 이번에 알아볼 Skip/Retry도 Spring Batch에서는 기본적으로 제공을 하는 기능이다. 간단한 예제를 통해서 알아보자. us-500.csv (웹에서 쉽게 구할수 있음) Chunk Example을 볼때 잠깐 나왔었던 500 row의 csv 파일이다. 테스트를 위해 사용이 될 것이고 Chunk 방식의 Batch를 사용해 이 파일을 읽어서 가공하고 DB에 쓸 것이다. 테스트는 파일을 가공하는 단계(Processor)에서 강제로 오류를 내고 그것을 잘 skip하는지 또는 잘 retry 하는지 살펴볼것이다. 여기서는 일단 Art라는 사람과 Donette라는 사람이 있다는것 정도 알아두자. Spring Batch Skip Exa..
지난 포스팅으로 Chunk 방식과 Tasklet 방식의 Spring Batch에 대해 알아보았다. 이제는 이 방식을 조금 응용하여 이를 병렬처리하는 방법에 대해 알아보겠다. Chunk와 Tasklet과 마찬가지로 이것도 매우 직관적이라 이해가 쉬울 것이다. SampleParallel.java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import o..
Chunk 방식은 정형화된 방식이라면 Tasklet 방식은 비교적 자유로운 방식이다. 따라서 실제로 batch를 사용할때 적어도 내가 경험해본 프로젝트에서는 Tasklet 방식을 훨씬 선호하였다. 이것도 Chunk와 마찬가지로 전에 Xml Config 방식으로 어떻게 사용하는지 살펴본적이 있는데 Springboot 기반의 Batch에서는 어떻게 사용을 하는지 알아보자. batch application 구조를 어떻게 잡느냐에 따라 Tasklet을 작성하는 방법은 다양하게 변할 수 있다. (Tasklet 내부를 작성하는건 동일하다. 표현법만 다를 뿐이다..) 필자는 크게 두가지 방법으로 구성을 해봤는데 Job 구성 클래스 외부에 tasklet 클래스를 만들어서 참조하는 방식이 있다. 이것은 tasklet 클..
지난 글에서 다뤘던 Springboot Batch Chunk Example에서 소스들을 살펴 볼때 Listener도 살짝 나왔다. 우리가 정의한 Job이나 Step 실행 전 후로 필요한 공통 작업을 기술하기 위해 주로 사용되며 사용된다. 이전에 사용했던 그림에 추가적으로 listener를 붙여봤다. 조악하기 그지 없다. listener 자체가 이해하기 그렇게 어려운 개념은 아니기에 이정도 그림이면 이해를 할것이라고 생각한다.. Job Listener Job의 실행 전후에 처리해야 할 일이 있을때 작성을 한다. 사용방법은 다음과 같다. @Bean public Job sampleChunkJob(SampleJobListener jobListener, Step sampleChunkStep) { return jo..