300===Dev Framework/Spring Batch

Spring Tasklet - 단일 배치 작업의 강력한 도구 🛠️

블로글러 2024. 11. 7. 09:31

Spring Batch에서 Tasklet은 단일 작업을 간단하게 구현할 수 있는 강력한 인터페이스입니다. 복잡한 데이터 처리보다 간단한 작업이 필요할 때, Tasklet은 최적의 선택이 될 수 있습니다.

여러분이 일상에서 특정 일을 처리하는 것을 생각해보세요.

  • 아침에 한 번만 이메일을 확인하는 것처럼, Tasklet은 단일 작업을 수행합니다.
  • 복잡한 절차 없이 필요한 작업만 간단히 실행하고 끝낼 수 있습니다.

왜 필요한가?

Spring Tasklet이 해결하는 문제들은 다음과 같습니다:

  1. 단순 작업의 복잡성 감소: 간단한 작업에 복잡한 Chunk 처리를 사용할 필요가 없습니다.
  2. 일회성 작업 처리: 파일 삭제, 디렉토리 생성 등 한 번만 실행하면 되는 작업에 적합합니다.
  3. 유연한 구현: 단일 메서드 구현만으로 다양한 배치 작업을 수행할 수 있습니다.
  4. 간단한 상태 관리: RepeatStatus를 통해 작업의 완료 여부를 쉽게 제어할 수 있습니다.
  5. 배치 전후 작업: 주 배치 처리 전후에 필요한 설정이나 정리 작업에 이상적입니다.

기본 원리

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 단위로 트랜잭션 처리
메모리 사용 메모리 부하가 클 수 있음 청크 단위로 처리하여 메모리 효율적
적합한 작업 파일 처리, 프로시저 호출, 단순 작업 데이터베이스 마이그레이션, 대량 데이터 처리

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 무한 루프 방지

    • RepeatStatus.CONTINUABLE 반환 시 반드시 종료 조건을 확인하세요.
    • 적절한 종료 조건이 없으면 무한 루프에 빠질 수 있습니다.
  2. 대용량 데이터 처리 주의

    • 대용량 데이터 처리는 Tasklet보다 Chunk 방식이 적합합니다.
    • Tasklet으로 대용량 처리 시 메모리 문제가 발생할 수 있습니다.
  3. 예외 처리 철저히

    • 작업 실패 시 롤백 전략을 미리 계획하세요.
    • 예외 발생 시 적절한 로깅과 에러 핸들링이 필요합니다.

💡 꿀팁

  • Tasklet을 람다식으로 간단히 구현할 수 있습니다: .tasklet((contribution, chunkContext) -> { ... })
  • 공통 기능은 별도의 Tasklet으로 분리하여 재사용성을 높이세요.
  • JobParameters를 통해 실행 시 필요한 파라미터를 전달할 수 있습니다.
  • ApplicationEventListener를 활용하여 Tasklet 실행 전후 이벤트 처리가 가능합니다.
  • 테스트 코드 작성 시 StepScopeTestExecutionListener를 활용하면 Tasklet을 쉽게 테스트할 수 있습니다.

마치며

지금까지 Spring Batch의 Tasklet에 대해 알아보았습니다. 처음에는 어렵게 느껴질 수 있지만, 단일 메서드 구현만으로 다양한 배치 작업을 수행할 수 있는 강력한 도구입니다. 소규모 작업이나 Chunk 방식으로 처리하기 어려운 작업에 Tasklet을 활용하면 효율적인 배치 시스템을 구축할 수 있습니다.

혹시 궁금한 점이 있으시거나, 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요.

참고 자료 🔖


#SpringBatch #Tasklet #JavaFramework #배치처리

728x90