Spring Batch에서 Tasklet은 단일 작업을 간단하게 구현할 수 있는 강력한 인터페이스입니다. 복잡한 데이터 처리보다 간단한 작업이 필요할 때, Tasklet은 최적의 선택이 될 수 있습니다.
여러분이 일상에서 특정 일을 처리하는 것을 생각해보세요.
- 아침에 한 번만 이메일을 확인하는 것처럼, Tasklet은 단일 작업을 수행합니다.
- 복잡한 절차 없이 필요한 작업만 간단히 실행하고 끝낼 수 있습니다.
왜 필요한가?
Spring Tasklet이 해결하는 문제들은 다음과 같습니다:
- 단순 작업의 복잡성 감소: 간단한 작업에 복잡한 Chunk 처리를 사용할 필요가 없습니다.
- 일회성 작업 처리: 파일 삭제, 디렉토리 생성 등 한 번만 실행하면 되는 작업에 적합합니다.
- 유연한 구현: 단일 메서드 구현만으로 다양한 배치 작업을 수행할 수 있습니다.
- 간단한 상태 관리: RepeatStatus를 통해 작업의 완료 여부를 쉽게 제어할 수 있습니다.
- 배치 전후 작업: 주 배치 처리 전후에 필요한 설정이나 정리 작업에 이상적입니다.
기본 원리
Spring Tasklet의 핵심 원리를 알아볼까요?
Tasklet 인터페이스
public interface Tasklet {
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}
Tasklet 인터페이스는 단 하나의 메서드 execute()
만 구현하면 됩니다. 이 메서드는 작업을 수행하고 RepeatStatus를 반환합니다.
RepeatStatus
public enum RepeatStatus {
CONTINUABLE, // 작업을 계속 실행
FINISHED // 작업 완료
}
RepeatStatus는 두 가지 상태를 가집니다:
CONTINUABLE
: Tasklet을 다시 실행해야 함FINISHED
: 작업 완료, 더 이상 실행하지 않음
실제 예제
대부분의 기업 환경에서는 정기적인 데이터 처리나 시스템 유지 관리를 위해 배치 작업을 구현합니다.
기본 사용법
// Tasklet 구현
public class SimpleTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("Simple Tasklet 실행됨");
// 단일 작업 수행 후 완료
return RepeatStatus.FINISHED;
}
}
// Job 및 Step 구성
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(simpleStep())
.build();
}
@Bean
public Step simpleStep() {
return stepBuilderFactory.get("simpleStep")
.tasklet(new SimpleTasklet())
.build();
}
}
조건부 반복 Tasklet
public class ConditionalTasklet implements Tasklet {
private int count = 0;
private final int maxCount = 5;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
count++;
System.out.println("Conditional Tasklet 실행 횟수: " + count);
if (count < maxCount) {
return RepeatStatus.CONTINUABLE; // 지정된 횟수만큼 계속 실행
} else {
return RepeatStatus.FINISHED; // 지정된 횟수 도달 시 완료
}
}
}
다음은 Tasklet과 Chunk 방식의 차이를 표로 정리한 예시입니다:
특성 | Tasklet | Chunk |
---|---|---|
처리 방식 | 단일 작업 중심 | 데이터 처리 중심 |
구현 복잡성 | 낮음 | 높음 |
데이터 처리량 | 소량 데이터에 적합 | 대량 데이터에 적합 |
트랜잭션 처리 | 전체 작업이 하나의 트랜잭션 | Chunk 단위로 트랜잭션 처리 |
메모리 사용 | 메모리 부하가 클 수 있음 | 청크 단위로 처리하여 메모리 효율적 |
적합한 작업 | 파일 처리, 프로시저 호출, 단순 작업 | 데이터베이스 마이그레이션, 대량 데이터 처리 |
주의사항 및 팁 💡
⚠️ 이것만은 주의하세요!
무한 루프 방지
- RepeatStatus.CONTINUABLE 반환 시 반드시 종료 조건을 확인하세요.
- 적절한 종료 조건이 없으면 무한 루프에 빠질 수 있습니다.
대용량 데이터 처리 주의
- 대용량 데이터 처리는 Tasklet보다 Chunk 방식이 적합합니다.
- Tasklet으로 대용량 처리 시 메모리 문제가 발생할 수 있습니다.
예외 처리 철저히
- 작업 실패 시 롤백 전략을 미리 계획하세요.
- 예외 발생 시 적절한 로깅과 에러 핸들링이 필요합니다.
💡 꿀팁
- Tasklet을 람다식으로 간단히 구현할 수 있습니다:
.tasklet((contribution, chunkContext) -> { ... })
- 공통 기능은 별도의 Tasklet으로 분리하여 재사용성을 높이세요.
- JobParameters를 통해 실행 시 필요한 파라미터를 전달할 수 있습니다.
- ApplicationEventListener를 활용하여 Tasklet 실행 전후 이벤트 처리가 가능합니다.
- 테스트 코드 작성 시 StepScopeTestExecutionListener를 활용하면 Tasklet을 쉽게 테스트할 수 있습니다.
마치며
지금까지 Spring Batch의 Tasklet에 대해 알아보았습니다. 처음에는 어렵게 느껴질 수 있지만, 단일 메서드 구현만으로 다양한 배치 작업을 수행할 수 있는 강력한 도구입니다. 소규모 작업이나 Chunk 방식으로 처리하기 어려운 작업에 Tasklet을 활용하면 효율적인 배치 시스템을 구축할 수 있습니다.
혹시 궁금한 점이 있으시거나, 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요.
참고 자료 🔖
- Spring Batch - Tasklets vs Chunks
- Spring Batch 개념 정리
- 처음 해보는 Spring batch, Tasklet 작성하기
- Spring Batch란? 이해하고 사용하기
- 스프링 배치 완벽 가이드 - 잡과 스텝 이해하기
#SpringBatch #Tasklet #JavaFramework #배치처리
'300===Dev Framework > Spring Batch' 카테고리의 다른 글
Spring Batch Step & Status - 배치 처리의 핵심 흐름 마스터하기 🔄 (0) | 2024.11.07 |
---|---|
Spring Batch 완벽 가이드 - 대용량 데이터 처리의 마법사 🪄 (1) | 2024.11.07 |
Quartz Framework Settings Explained (0) | 2024.05.29 |
Managing Spring Batch Settings in `application.properties` (0) | 2024.05.29 |
Quartz Introduced (0) | 2024.05.27 |