Spring Batch 에서 자주 사용하는 @Scheduled 어노테이션이 있습니다. 이는 Spring Boot 기반에서 제공이 되기 때문에 배치와 같이 잡 스케줄러에서 주로 사용하기도 합니다. 시간이 되면 알아서 작동되는 서비스기능이지만 여기에는 단점이 하나 존재합니다. 바로 같은 서비스를 동시에 돌릴수는 없다는 점입니다. 즉, 중복 실행 방지 옵션이 있습니다. 보통 Schedule가 붙고 Batch를 실행하게 되면 Batch Job Repository를 수행하는 Meta Table들이 많이 생깁니다. 그 메타 테이블들은 제가 작성한 다른 글에 좀 더 상세하게 기록되어 있습니다. https://abbo.tistory.com/255 Spring Batch Job Repository Job Reposito..
오늘은 젠킨스(Jenkins)에서 주로 사용하는 Spring Batch의 실행 커맨드 Script를 작성해볼까 합니다. 우선 아래와 같이 통짜 명령어를 먼저 살펴본 후 이것이 어떤 의미를 갖는지 살펴보겠습니다. java -jar -Dspring.profiles.active=batch ${BATCH_JAR_HOME}/batch-1.11.3.jar --job.name=jenkinsRunnerJob baseDate=${baseDate} version=${VERSION} 1. java -jar 쉽게 말해 자바 명령어를 사용해 jar 파일을 실행한다는 옵션입니다. 2. -Dspring.profiles.active 자바 프로젝트는 application-${profile}.yaml 또는 .properties로 프로파..
이번 글에서는 스프링 배치의 Job을 실행하면서 Step을 순서대로 실행시키는 것이 아닌 병렬로 처리하는 방법을 간단히 적어보고자 합니다. 저는 Step1, Step2, Step3 은 동시에 실행되고 Step4는 앞의 스텝이 모두 끝난 뒤 실행하고 싶습니다. 한 번 코드로 작성해보겠습니다. @Configuration @RequiredArgsConstructor public class ParallelBatch { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private static final String JOB_NAME = "ParallelJob"; private ..

Job Repository는 스프링 배치에 대한 메타 데이터를 저장합니다. 그 구조는 spring-batch-core에 존재합니다. mysql을 사용하므로 mysql.sql을 복사해 생성해보겠습니다. 다음과 같이 여러 테이블이 생성되었습니다. 테이블마다 역할은 다음과 같습니다. BATCH_JOB_INSTACE - job이 실행되며 생성되는 최상위 계층의 테이블입니다 - job_name과 job_key를 기준으로 하나의 row가 생성되며, 같은 name, key는 저장될 수 없습니다. - job_key는 BATCH_JOB_EXECUTION_PARAMS에 저장되는 Parameter를 나열해 암호화해 저장합니다. - JobInstace클래스와 매핑 됩니다. BATCH_JOB_EXECTION - job이 실행되..

이번에 배치 실패 시 알림을 보내는 기능을 구현 하면서 배치에서 제공하는 리스너에 대해 정리한 내용을 공유하려고 합니다 스프링 배치 프레임 워크 다음 아키텍처는 스프링 배치의 프레임 워크의 구성 요소를 보여 줍니다 스프링 배치 작업은 오랫동안 실행될 수 있으며 진행 정보를 제공하는 것이 중요합니다. 진행 중인 작업, 실패한 작업 및 완료된 작업 등 모든 정보는 배치 이벤트 리스너를 사용해서 수집 및 가공할 수 있습니다. 서비스 운영 중 배치의 실패 여부를 알기 위해 확인을 위한 알림이 필요했습니다. 배치는 여러 개의 이벤트 리스너를 제공하며 그중 Job , Step 을 보조해주는 JobExectionListener 와 StepExecutionListener 가 성공과 실패에 관계없이 이벤트 결과값을 반환..

배치를 처리할 수 있는 방법은 크게 2가지로 나뉩니다. Tasklet로는 단순하게 처리할 수 있는 장점이 있으나, 대 용량을 감당하기엔 부하를 감당할 수 없습니다. 따라서 Chunk를 통해 쪼개서 넣을 필요가 있는데, Tasklet로도 쪼개서 넣을 수 있지만, 가독성에서 떨어지기 때문에 권장하지 않습니다. 현재 사용하고 있는 실무에서도 대용량은 Chunk를 적극 사용하고 있다. 그렇다면 Tasklet 방식과 Chunk 방식에 대해 알아보자. ● Tasklet을 사용한 Task 기반 처리 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용 대량 처리를 하는 경우 더 복잡 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합 ● Chunk를 사용한 chunk(덩어리) 기반 처리 ItemReader, ItemP..

오늘은 배치 프로그램(Batch Program)과 배치 스케줄러(Batch Scheduler)에 대해서 알아보고자 합니다. 우선 배치 프로그램(Batch Program)이란 무엇일까요? 배치 프로그램(Batch Program)이란? 배치 프로그램은 사용자와의 상호 작용 없이 여러 작업들을 미리 정해진 일련의 순서에 따라 일괄적으로 처리하는 것을 의미한다. 시나공 정보처리기사 실기 배치 프로그램(Batch Program)은 수행되는 주기에 따라서 구분해볼 수도 있습니다. 정기 배치 일, 주, 월과 같이 정해진 기간에 정기적으로 수행 이벤트성 배치 특정 조건을 설정해두고 조건이 충족될 때만 수행 On-Demand 배치 사용자 요청 시 수행 그럼 다음에는 배치 프로그램(Batch Program)이 갖추어야..

1. Scope 그리고 스프링의 기본 Scope, Singleton 앞선 장에서 설명드리지 않았으나 무척이나 중요한 역할을 하던 컴포넌트가 있습니다. 바로 배치가 실행될 때 Spring Bean을 생성하는 시점을 명시하는 @JobScope와 @StepScope 입니다. @Bean @StepScope public ListItemReader unPaidMemberReader() { log.info("********** This is unPaidMemberReader"); List activeMembers = memberRepository.findByStatusEquals(MemberStatus.ACTIVE); log.info(" - activeMember SIZE : " + activeMembers.size..