[스프링] Spring Batch

gyeol·2024년 9월 18일

스프링

목록 보기
45/50
post-thumbnail

Spring Batch

데이터 대용량 일괄처리 위해 사용한다.
-> 초기 데이터 csv에서 불러와야해서 사용

SpringBatch 그 자체로는 일을 수행하지 못한다. Configuration Bean을 통해 해당 Job이 실행될 경우에 어떤 일을 처리할 지 세팅할 뿐 실행을 위해선 Batch Scheduler가 필요하다.

JobRepository

batch 수행하는데 필요한 전반적인 객체를 가진다. 일의 상태 유지/관리, batch와 관련된 crud를 처리한다.

Job

배치 처리과정을 하나의 단위로 만들어놓은 객체이다.
배치 처리 과정에 있어서 최상단 객체이다.

Joblauncher

job 실행시키는 역할이다.
jobjobparameters를 param으로 받고 JobExecution을 반환한다.
우리가 직접 컨트롤할 일은 없다.

Step

job을 구성하는 독립적인 작업 단위이다. 실제 배치가 실행되는 처리를 정의하고 제어하는데 필요한 모든 정보를 가지고 있는 object이다.
Step은 TaskletChunk 기반으로 수행되며 이는 유저가 선택할 수 있다.

  • Tasklet : 한가지 이상 CRUD가 발생하는 task에 대해 일괄적으로 처리하는 경우 채택한다.
  • Chunk : Chunk 단위로 처리할 모든 데이터를 읽어들인 후 모두 읽어들이는데에 성공했으면 한번에 write 하는 방식으로, 대용량 데이터에 대해 단순 처리할 경우 채택한다.

Itemreader

대상이되는 데이터를 읽어들인다. db에서 읽어오거나 file I/O 통해 불러오기도 한다.

Itemprocessor

read와 write 중간 단계에서 가공 역할을 한다.

Itemwriter

batch 마지막 단계이다. 가공된 데이터 출력하는 역할을 한다.
ItemWriter를 사용해 DB에 내용을 다시 저장할 수도 있고 해당 데이터를 다른 프로젝트로 호출 시킬수도 있다.

Spring Batch Job 생성하기

먼저 build.gradle에 의존성을 주입해주고 관련 설정을 추가해준다.

implementation 'org.springframework.boot:spring-boot-starter-batch'
spring:
  batch:
    jdbc:
      initialize-schema: always
    job:
      name: testJob # job 이름 설정
      
  datasource:
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/${DB_NAME}?serverTimezone=Asia/Seoul
      username: ${DB_USERNAME}
      password: ${DB_PASSWORD}

1. @EnableBatchProcessing 추가

프로젝트 생성 시 최초 메인 Application 클래스 위에 @EnableBatchProcessing 애노테이션을 적어준다.

@SpringBootApplication
@EnableBatchProcessing
public class TestApplication {

	public static void main(String[] args) {
		SpringApplication.run(JobPracticeApplication.class, args);
	}

}

2. JobConfig 클래스 생성

특정 Job을 수행하기 위한 클래스 파일을 만든다.

@Slf4j
@Configuration
@RequiredArgsConstructor
public class JobConfiguration {
					...
}

3. Job 생성

Job은 단일 Step으로 구성했다.

			...
    @Bean
    public Job FirstJob(JobRepository jobRepository){
        return new JobBuilder("FirstJob", jobRepository)
                .start(FirstStep(jobRepository))
                .build();
    }
    			...

4. Step 생성

Job에 포함되는 Step을 생성해야 한다.

			...
    @Bean
    public Step FirstStep(JobRepository jobRepository){
        return new StepBuilder("FirstStep",jobRepository)
                .<String, String>chunk(1000,transactionManager) // chunk 기반으로 동작, chunk size는 1000으로 설정
                .reader(itemReader())
                .writer(itemWriter())
                .build();
    }
    			...

5. ItemReader 생성

Batch를 통해 처리하고자 하는 데이터를 읽어들이는 ItemReader 부분이다.

				...
    @Bean
    public ItemReader<String> itemReader(){
        return new ItemReader<String>() {
            @Override
            public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
                return "Read OK";
            }
        };
    }
    			...

6. ItemWriter 생성

배치를 통해 처리된 데이터에 대한 출력을 담당하는 ItemWriter 부분이다.

     			...
    @Bean
    public ItemWriter<String> itemWriter(){
        return strList -> {
            strList.forEach(
                    str -> log.info("str: {}", str) // ItemReader에서 처리한 데이터가 String List 형태로 담겨서 로그 출력
            );
        };
    }
     			...

참고1 : https://velog.io/@cho876/Spring-Batch-job-%EC%83%9D%EC%84%B1
참고2 : https://spring.io/batch

profile
공부 기록 공간 '◡'

1개의 댓글