Spring Batch
-
이번 포스트에서는 DB To DB가 아니라 RestApi로 제공되는 데이터를 백업하는 과정을 살펴보자. RestApi Backup 결재 정보 처리를 위한 Model 처리먼저 결재 정보를 페이지 단위로 서비스하는 Rest API를 생각해보자.먼저 sakila 쪽에는 페이지 단위로 결재 정보를 반환하는 쿼리 처리가 필요하다. SELECT payment_id, customer_id, staff_id, rental_id, amount, payment_date, last_update FROM payment ORDER BY payment_id ASC limit 10 offset #{offset} // SakilaMapper.javapublic interface Sakila..
10. RestApi Batch이번 포스트에서는 DB To DB가 아니라 RestApi로 제공되는 데이터를 백업하는 과정을 살펴보자. RestApi Backup 결재 정보 처리를 위한 Model 처리먼저 결재 정보를 페이지 단위로 서비스하는 Rest API를 생각해보자.먼저 sakila 쪽에는 페이지 단위로 결재 정보를 반환하는 쿼리 처리가 필요하다. SELECT payment_id, customer_id, staff_id, rental_id, amount, payment_date, last_update FROM payment ORDER BY payment_id ASC limit 10 offset #{offset} // SakilaMapper.javapublic interface Sakila..
2026.01.10 -
이번 포스트에서는 Batch 작업 실패 시 대처를 위한 fault tolerant에 대해 살펴보자. FaultTolerant 전략Tolerant란 관대한이라는 뜻이다. FaultTolerant는 따라서 실패에 관대한 내 결함성을 의미한다.지난 포스트에서 살펴봤던 시나리오를 다시 생각해보자.중간에 작은 오류가 발생하더라도 예외가 발생하고 배치 작업은 중단된다. 물론 다지 중단지점에서 재 시작 할 수는 있지만 일단 기존의 프로세스는 중단된다.긴 배치 작업을 처리하다 보면 일시적인 네트워크 오류 상황이나 DB 커넥션 풀이 부족한 상황, 외부 API 호출 실패 상황 등 순간적인 장애 등이 발생하는 경우가 왕왕 있다. 이때마다 그냥 배치를 중단 시킨다기 보다는 관대하게 몇 초 있다가 다시 시도(retry)하거..
09. Backup Batch - 5이번 포스트에서는 Batch 작업 실패 시 대처를 위한 fault tolerant에 대해 살펴보자. FaultTolerant 전략Tolerant란 관대한이라는 뜻이다. FaultTolerant는 따라서 실패에 관대한 내 결함성을 의미한다.지난 포스트에서 살펴봤던 시나리오를 다시 생각해보자.중간에 작은 오류가 발생하더라도 예외가 발생하고 배치 작업은 중단된다. 물론 다지 중단지점에서 재 시작 할 수는 있지만 일단 기존의 프로세스는 중단된다.긴 배치 작업을 처리하다 보면 일시적인 네트워크 오류 상황이나 DB 커넥션 풀이 부족한 상황, 외부 API 호출 실패 상황 등 순간적인 장애 등이 발생하는 경우가 왕왕 있다. 이때마다 그냥 배치를 중단 시킨다기 보다는 관대하게 몇 초 있다가 다시 시도(retry)하거..
2026.01.09 -
이번 포스트에서는 배치 작업 실패 시 restart에 대해 살펴보자. 문제 상황의 이해 문제 상황대량의 데이터를 batch로 처리하다 보면 로직적인 문제 뿐 아니라 네트워크 문제, 데이터 오류 등 다양한 문제가 발생할 수 있다. 여기서는 이런 상황을 가정하여 ItemProcessor에서 payment_id==12000인 경우 임의로 오류를 발생시켜 보자.// 클래스 레벨에 Map 선언private int failCount = 3;@Bean@StepScopeItemProcessor paymentFailProcessor( @Value("#{jobParameters['yearMonth']}") String yearMonth) { return payment -> { log..
08. Backup Batch - 4이번 포스트에서는 배치 작업 실패 시 restart에 대해 살펴보자. 문제 상황의 이해 문제 상황대량의 데이터를 batch로 처리하다 보면 로직적인 문제 뿐 아니라 네트워크 문제, 데이터 오류 등 다양한 문제가 발생할 수 있다. 여기서는 이런 상황을 가정하여 ItemProcessor에서 payment_id==12000인 경우 임의로 오류를 발생시켜 보자.// 클래스 레벨에 Map 선언private int failCount = 3;@Bean@StepScopeItemProcessor paymentFailProcessor( @Value("#{jobParameters['yearMonth']}") String yearMonth) { return payment -> { log..
2026.01.08 -
이번 포스트에서는 Job을 실행시켜보자. JobOperator 기본JobOperator는 JobOperatorFactoryBean에 의해 공급되며 기본 빈으로 제공 되기 때문에 쉽게 주입받아서 사용할 수 있다.public class JobOperatorFactoryBean implements FactoryBean, ApplicationContextAware, InitializingBean { ...}JobOperator의 start()를 호출하면 JobExecution을 만들고 여기에 JobParameters를 저장해서 Job을 실행하게..
07. Backup Batch - 3이번 포스트에서는 Job을 실행시켜보자. JobOperator 기본JobOperator는 JobOperatorFactoryBean에 의해 공급되며 기본 빈으로 제공 되기 때문에 쉽게 주입받아서 사용할 수 있다.public class JobOperatorFactoryBean implements FactoryBean, ApplicationContextAware, InitializingBean { ...}JobOperator의 start()를 호출하면 JobExecution을 만들고 여기에 JobParameters를 저장해서 Job을 실행하게..
2026.01.07 -
이번 포스트에서는 지난 시간에 이어서 간단한 동작을 처리하는 Tasklet을 추가해서 Job을 완성해보자. Tasklet을 활용한 Step Tasklet이전 포스트에서 배웠던 Step은 ItemReader -> [ItemProcessor ->] ItemWriter의 과정을 거쳐 chunk 단위로 데이터를 처리한다. 하지만 배치 잡 시작 전에 특정 초기화를 진행한다든지, 메인 처리 이후 마무리 작업을 진행하는 과정에는 특별한 ItemReader, ItemWriter 등이 필요 없는 상황도 발생한다. 이런 경우 Tasklet을 사용하여 TaskletStep을 구성할 수 있다.Tasklet은 execute()는 TaskletStep에 의해 반복적으로 호출되는데 RepeatStatus.FINISHED(작업 끝..
06. Backup Batch - 2이번 포스트에서는 지난 시간에 이어서 간단한 동작을 처리하는 Tasklet을 추가해서 Job을 완성해보자. Tasklet을 활용한 Step Tasklet이전 포스트에서 배웠던 Step은 ItemReader -> [ItemProcessor ->] ItemWriter의 과정을 거쳐 chunk 단위로 데이터를 처리한다. 하지만 배치 잡 시작 전에 특정 초기화를 진행한다든지, 메인 처리 이후 마무리 작업을 진행하는 과정에는 특별한 ItemReader, ItemWriter 등이 필요 없는 상황도 발생한다. 이런 경우 Tasklet을 사용하여 TaskletStep을 구성할 수 있다.Tasklet은 execute()는 TaskletStep에 의해 반복적으로 호출되는데 RepeatStatus.FINISHED(작업 끝..
2026.01.06 -
이번 포스트에서는 간단한 Backup batch를 만들어보면서 Step을 구성해보자. 기본 작업 배치 시나리오 및 Mapper 설정이번에 처리해볼 배치는 매월 source인 Sakila에 있는 대량의 결재 정보를 target인 quietjun에 백업하는 작업이다.실제 비지니스에서도 아주 오래된 결재 내역을 운영 DB에서 계속 가져갈 경우 부하가 증가할 수 있기 때문에 최근의 이력만을 가져가는게 유리한데 그렇다고 무작정 지워버리면 법적으로 문제되기 때문에 주기적인 백업이 필요한 상황이다.현재 sakila database에 쌓인 결재 내역은 다음의 쿼리로 확인할 수 있다.select date_format(payment_date, '%Y-%m') as 'yearMonth' , count(payment_id..
05. Backup Batch - 1이번 포스트에서는 간단한 Backup batch를 만들어보면서 Step을 구성해보자. 기본 작업 배치 시나리오 및 Mapper 설정이번에 처리해볼 배치는 매월 source인 Sakila에 있는 대량의 결재 정보를 target인 quietjun에 백업하는 작업이다.실제 비지니스에서도 아주 오래된 결재 내역을 운영 DB에서 계속 가져갈 경우 부하가 증가할 수 있기 때문에 최근의 이력만을 가져가는게 유리한데 그렇다고 무작정 지워버리면 법적으로 문제되기 때문에 주기적인 백업이 필요한 상황이다.현재 sakila database에 쌓인 결재 내역은 다음의 쿼리로 확인할 수 있다.select date_format(payment_date, '%Y-%m') as 'yearMonth' , count(payment_id..
2026.01.05 -
이번 포스트에서는 앞으로 진행할 과정을 위한 프로젝트를 구성해보자. Project 구성 진행될 배치 시나리오 프로젝트 의존성Spring Batch 를 사용하기 위해서 spring-boot-starter-batch와 spring-boot-starter-batch-jdbc가 필요하다. 추가로 mysql, mybatis, webmvc에 대한 의존성도 추가해주자. org.springframework.boot spring-boot-starter-batch org.springframework.boot spring-boot-starter-batch-jdbc com.mysql mysql-connector-j runtime org.springframework.boot spring-boot-starter..
04. Project 구성이번 포스트에서는 앞으로 진행할 과정을 위한 프로젝트를 구성해보자. Project 구성 진행될 배치 시나리오 프로젝트 의존성Spring Batch 를 사용하기 위해서 spring-boot-starter-batch와 spring-boot-starter-batch-jdbc가 필요하다. 추가로 mysql, mybatis, webmvc에 대한 의존성도 추가해주자. org.springframework.boot spring-boot-starter-batch org.springframework.boot spring-boot-starter-batch-jdbc com.mysql mysql-connector-j runtime org.springframework.boot spring-boot-starter..
2026.01.04 -
이번 포스트에서는 Spring Batch의 핵심 개념과 관련 용어를 살펴보자. 핵심 개념과 관련 용어 기본 흐름다음 그림은 Spring Batch의 주요 요소들을 나타낸다. 파란색 계열은 Spring Batch Framework가 제공하는 인프라 및 관리 영역으로 개발자는 이 구조를 설정하고 구성한다. 노란색 계열을 실제 비지니스 로직이 들어가는 부분으로 개발자는 '어디서 데이터를 읽어서', '어떤 처리를 한 후', '어디에 저장할 지'를 구체적으로 작성한다. 계층 구조 및 흐름JobOperator → JobJobOperator는 배치 작업을 제어(시작, 중지, 재시작)하는 인터페이스사용자나 스케줄러가 JobOperator를 통해 Job을 실행한다.Job (1) →(*) StepJob은 전체 배치의 껍데..
03. SpringBatch 핵심 개념이번 포스트에서는 Spring Batch의 핵심 개념과 관련 용어를 살펴보자. 핵심 개념과 관련 용어 기본 흐름다음 그림은 Spring Batch의 주요 요소들을 나타낸다. 파란색 계열은 Spring Batch Framework가 제공하는 인프라 및 관리 영역으로 개발자는 이 구조를 설정하고 구성한다. 노란색 계열을 실제 비지니스 로직이 들어가는 부분으로 개발자는 '어디서 데이터를 읽어서', '어떤 처리를 한 후', '어디에 저장할 지'를 구체적으로 작성한다. 계층 구조 및 흐름JobOperator → JobJobOperator는 배치 작업을 제어(시작, 중지, 재시작)하는 인터페이스사용자나 스케줄러가 JobOperator를 통해 Job을 실행한다.Job (1) →(*) StepJob은 전체 배치의 껍데..
2026.01.03