๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring/SpirngBatch

Spring Batch (3)

๐Ÿคฉ Spring Batch ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค !

 

SpringBoot ํ”„๋กœ์ ํŠธ๋Š” IntelliJ๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ๊ฒฝ์šฐ, ํˆด ๋‚ด์—์„œ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์‹ค ๊ฒฝ์šฐ, spring.io๋ผ๋Š” ๊ณต์‹ ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜์‹œ๋ฉด ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” ์กฐ์กธ๋‘๋‹˜์˜ jojoldu.tistory.com/325?category=902551 ํฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜ํ•œ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

 

๋จผ์ €, ์ •๋ง ์ •๋ง ์ •๋ง * 100 ๊ฐ„๋‹จํ•œ ๋ฐฐ์น˜ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ BatchApplication.java์— @EnableBatchProcessing ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ Spring Batch๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// Spring Batch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@EnableBatchProcessing
@SpringBootApplication
public class BatchApplication {

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

}

 

๊ทธ ํ›„, SimpleJobConfiguration.java๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ Job๊ณผ Step์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@RequiredArgsConstructor // ์ƒ์„ฑ์ž DI๋ฅผ ์œ„ํ•œ lombok ์–ด๋…ธํ…Œ์ด์…˜
@Configuration // SpringBatch์˜ ๋ชจ๋“  job์€ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob") // Job ์ด๋ฆ„์€ Builder๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ
                .start(simpleStep1()) //Step
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1") // Step ์ด๋ฆ„์€ Builder๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ
                // step ์•ˆ์—์„œ ์‹คํ–‰๋  ๊ธฐ๋Šฅ๋“ค์„ tasklet ๋ฐฉ์‹์„ ํ†ตํ•ด ์ง€์ •
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>> ์ด๊ณณ์€ simpleStep1 ์ž…๋‹ˆ๋‹ค.");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

 

์ด๋ ‡๊ฒŒ ํ•˜์—ฌ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Job๊ณผ ๊ทธ์— ์†ํ•œ Step์„ ์‹คํ–‰ํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ShutDown๋˜๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์›๋ž˜์˜ ์›น์ด๋ผ๋ฉด ShutDown์ด ์•ˆ๋˜๋Š”๋ฐ ๋ง์ด์ฃ !)

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ Batch Application์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค..!


 

๐Ÿค” ๊ทผ๋ฐ, Batch Application์€ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„ํ…๋ฐ์š”...?

๋„ค, ๊ทธ๋ž˜์„œ ์ด์ œ DB๋„ ์—ฐ๊ฒฐํ•ด๋ณด๊ณ  .. Chunk๋ฐฉ์‹๋„ ์‚ฌ์šฉํ•ด ์œ„ ์˜ˆ์ œ๋ณด๋‹ค ์ข€ ๋” ๋ณต์žกํ•œ Batch Application์„ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”!

 

๊ทธ ์ „์— ๋จผ์ € Meta Data๋ผ๋Š” ๊ฒƒ์„ ์ข€ ๋ณผ๊นŒ์š”...?

๐Ÿ‘ฉ๐Ÿป‍๐Ÿซ Spring Batch MetaData

Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Meta Data Schema(docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด MetaData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ์š”.

- ์ด์ „์— ์‹คํ–‰ํ•œ Job์˜ ์ •๋ณด

- ์ตœ๊ทผ ์‹คํŒจํ•œ Batch Parameter์˜ ์ •๋ณด

- ์„ฑ๊ณตํ•œ Job์˜ ์ •๋ณด

- ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋””์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด

- ์–ด๋–ค Job์— ์–ด๋–ค Step๋“ค์ด ์žˆ์—ˆ๊ณ , Step๋“ค ์ค‘ ์„ฑ๊ณตํ•œ Step๊ณผ ์‹คํŒจํ•œ Step๋“ค์€ ์–ด๋–ค๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€

๋“ฑ๋“ฑ...

ํ•œ ๋งˆ๋””๋กœ Batch System์ด Run๋  ๋•Œ์˜ ๋ชจ๋“  ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค...!

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์ด ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐ๋œ DB์— ์กด์žฌํ•ด์•ผ์ง€๋งŒ, SpringBatch๊ฐ€ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”!

๊ธฐ๋ณธ์ ์œผ๋กœ H2 DB๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ Boot๊ฐ€ ์‹คํ–‰๋ ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ์ง€๋งŒ, 

MySQL์ด๋‚˜ Oracle๊ณผ ๊ฐ™์€ DB๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ๋ฐ‘์˜ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ์— ์ด ํ…Œ์ด๋ธ”๋“ค์— ๋Œ€ํ•œ SQLํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋˜์–ด ์žˆ์œผ๋‹ˆ, ๊ฐ์ž DB์— ์‚ฝ์ž…ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 


๐Ÿคฉ MySQL๊ณผ ์—ฐ๋™ํ•˜๊ธฐ

๊ฐ ์šด์˜์ฒด์ œ์— ๋งž์ถ”์–ด MySQL์„ ์„ค์น˜ํ•˜๊ณ  ๊ณ„์ • ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (์›น์ƒ์— ๋งŽ์ด ๋‚˜์™€์žˆ์–ด ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

์„ค์ • ํ›„, ํ”„๋กœ์ ํŠธ์˜ application.yml์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” h2 / mysql ํ™˜๊ฒฝ์„ active๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ์— active์˜ local์„ mysql๋กœ ๋ฐ”๊พธ์–ด์ค๋‹ˆ๋‹ค.

spring:
  profiles:
    active: local

spring:
  profiles: local
  datasource:
    hikari:
      jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
      username: 
      password:
      driver-class-name: org.h2.Driver

spring:
  profiles: mysql
  datasource:
    hikari:
      jdbc-url: jdbc:mysql://localhost:3306/spring_batch
      username: root
      password:
      driver-class-name: com.mysql.jdbc.Driver

 

'Spring > SpirngBatch' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Batch (4) - MetaData  (0) 2021.05.30
Spring Batch (2)  (0) 2021.05.06
SpringBatch  (0) 2021.03.24