티스토리 뷰

앞서 설명한 Chunk 방식을 사용하지 않는 경우 Tasklet 방식의 Batch를 사용한다고 했었다. 두 방식 모두 많이 쓰이는데 장단이 있다. 생각나는대로 말해보면 Chunk 방식은 포맷이 딱 정해져 있어서 그에 맞게 코드를 작성해야 하지만 성능적으로 우수하고, Tasklet 방식은 정해진 형식이 없고 자유롭게 코드를 작성할수 있고 쉽지만 Spring Batch에서 제공하는 다양한 기능들을 활용하지는 못한다. Spring Batch에 대한 이해도가 낮거나 외부 연동작업이라던지 성능이 크게 중요하지 않은 배치 작업을 할때는 Tasklet 방식을 많이 사용하는데 이에 대해 알아보자. 

 

그럼 tasklet 방식의 배치는 어떤게 구현을 해야 하는지 살펴보자. (xml config 로 진행한다.)

사용한 spring batch의 version은 4.0.1.RELEASE 이다. 


context-batch-job-tasklet.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
	http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
	
	<batch:job id="tasklet-job">
		<batch:step id="tasklet-step">			
			<batch:tasklet ref="studentTasklet" />
		</batch:step>
	</batch:job>
	
	<bean id="studentTasklet" class="sample.template.tasklet.StudentTasklet" />
</beans>

 

batch의 기본인 job을 설정하고 그에 따른 step, 그리고 tasklet을 설정한다. chunk 방식으로 할때도 tasklet을 설정하고 그 안에 chunk를 정의했는데 tasklet 방식에서는 바로 배치를 수행할 클래스를 tasklet에 매핑을 하면 된다. 아주 간단하게 정의해서 사용을 할 수 있다. 

 

StudentTasklet.java

@Slf4j
public class StudentTasklet implements Tasklet{
      
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        
        log.debug(chunkContext.getStepContext().getStepExecution().getId() + " is run!");
        
        //이곳에 batch 로직 구현
        
        return RepeatStatus.FINISHED;
    }
}

 

tasklet은 Tasklet을 implements 하여 구현을 한다. 실행할 내용은 execute() 안에 기술을 하면 된다.  execute의 parameter인 StepContribution과 ChunkContext의 설명은 다음과 같다. 

 

contribution - mutable state to be passed back to update the current step execution

chunkContext - attributes shared between invocations but not between restarts

 

모든 작업이 끝나면 종료를 알리는 RepeatStatus.FINISHED 로 return을 해주며 tasklet 방식의 배치는 끝이 난다. 

 

 

추가적으로 이 Tasklet에 Listener도 더해 사용을 할 수 있다. execute() 수행 전 후로 할일을 기술할 수 있다는 것이다. 

 

StudentTasklet.java (listener 추가)

@Slf4j
public class StudentTasklet implements Tasklet, StepExecutionListener{
      
    public void beforeStep(StepExecution stepExecution) {
        log.debug("before execute()!");
    }
    
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        log.debug("execute()!");
        return RepeatStatus.FINISHED;
    }
    
     public ExitStatus afterStep(StepExecution stepExecution) {
        log.debug("after execute()!");
        return ExitStatus.COMPLETED;
    }
}

 

이런식으로 StepExecutionListener 를 활용하여 실행메소드 전후에 추가적으로 작업을 할 수 있다. 

 

구성만 잘 해놓는다면 tasklet 방식은 개발자가 spring batch를 전혀 모른다고 하더라도 문제없이 사용을 할 수 있다. 위에서 설명한대로 execute() 메소드 안에 내용만 잘 채워넣으면 되기 때문이다. 그만큼 간단하고 유용한 기술인것 같다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31