[ 스프링 배치 입문 #1 ] - 배치란 무엇인가

정동욱·2023년 7월 2일
0
post-thumbnail

이번 글에서는 스프링 배치 프레임워크에 대해 알아볼데요, 먼저 배치란 특정 주기마다 데이터를 처리하는 작업을 말합니다. 주로 정산이나 통계 혹은 로깅관리 등에 쓰이며 주나 월마다 한 번 실행됩니다.

이 배치 작업은 스프링 프레임워크를 이용하지 않고 순수 언어만으로도 만들 수 있습니다만, 스프링 배치를 이용하면 비교적 매우 간단하게 배치 프로그램을 만들 수 있습니다. 또한 스프링 배치는 스프링의 특성을 그대로 가져왔기 때문에 의존관계 주입과 같은 스프링의 기존 요소들을 그대로 사용할 수 있습니다.

실제 프로그램을 만들기 전에 배치에 사용되는 용어들을 미리 정리해보겠습니다.

Job: 실행되는 작업의 단위 개념이며 실제 객체
JobLauncher: Job을 실행하는 객체
Step: 데이터 읽기/쓰기 등의 Job 내의 독립된 작업 단위. Job은 최소한 1개의 Step을 가져야 함

스프링 배치를 사용하기 위해서 먼저 프로젝트 생성 시 Dependency 등록을 해줍니다.

implementation 'org.springframework.boot:spring-boot-starter-batch'

추가적으로 아래 configuration-processor를 등록해주어도 되는데요, 롬복처럼 스프링 배치에 도움되는 어노테이션들을 지원해줍니다.

annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'

또 yml파일에 배치 관련해 설정을 해주는데요, 아래 설정은 속성의 값을 외부화해 배치를 동적으로 작동시킬 수 있게 해줍니다.

spring:
  batch:
    job:
      names: ${job.name:NONE}

그리고 스프링부트의 메인 클래스에 @EnableBatchProcessing 어노테이션을 명시해주면 스프링 배치를 사용할 준비는 끝이 납니다.

@EnableBatchProcessing
@SpringBootApplication
public class BatchApplication {

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

}

그럼 먼저 콘솔에 "Hello World Spring Batch"를 찍는 배치 프로그램을 만들어볼텐데요, Job 패키지를 생성하고 그 안에 HelloWorldJobConfig라는 클래스를 만듭니다. 그리고 빈 등록을 위해 @Configuration 어노테이션을 붙입니다.
@Configuration
public class HelloWorldJobConfig {

}

스프링 배치를 이용하기 위해서는 의존관계 주입이 필요한데요, JobBuilderFactory과 StepBuilderFactory 객체를 DI해줍니다.

@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

}

그리고 순서대로 가장 먼저 Job을 만들고, 해당 Job의 Step을 만들어 줍니다. 보시면 Job과 Step을 매서드로 만들고 그 위에 @Bean 어노테이션을 붙였습니다. 그리고 매서드의 반환을 각각 Job과 Step으로 했는데, 이때 위에서 DI한 BuilderFactory가 사용됩니다.

@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloWorld() {
        return jobBuilderFactory.get("helloWorldJob") // 이 Job의 이름을 지정
                .incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
                .start(helloWorldStep()) // 실행될 Step을 명시
                .build();
    }

    @Bean
    @JobScope
    public Step helloWorldStep() {
        return stepBuilderFactory.get("helloWorldStep") // 이 Step의 이름을 지정
                .tasklet(helloWorldTasklet()) // Step 이하의 작업 단위인 tasklet 지정
                .build();
    }
    
    @Bean
    @StepScope
    public Tasklet helloWorldTasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, 
                                        ChunkContext chunkContext) throws Exception {
                System.out.println("Hello World Spring Batch");
                return RepeatStatus.FINISHED;
            }
        };
    }
}

보면 @JobScope과 @StepScope를 사용한 것을 볼 수 있습니다. 이 어노테이션들은 스프링 컨테이너가 띄워질 때가 아닌, 해당 작업이 실행될 때에 빈으로 생성되게 해 리소스 관리에 도움을 줍니다.

이제 만들 프로그램을 실행시킬 차례인데요, 아까 위에 yml에서 외부화한 배치 속성 값을 RunConfiguration에서 정해줍니다.

그리고 실행시키면 아래와 같이 콘솔에 찍히는 것을 볼 수 있습니다.

다음 글에서는 배치 프로그램 실행 시 파라미터로 파일을 받는 방법을 알아보겠습니다.

profile
거인의 어깨 위에서 탭댄스를

0개의 댓글