java

[Spring batch] Step 1 - 최초의 Batch app 만들기

두리공장 2022. 3. 20. 22:49

스프링 배치로 배치 서비스를 개발해 보고자 한다.

구현하고자 하는 배치 서비스의 프로세스는 다음과 같다


CSV 파일 읽기 => RDBMS 에 Insert 하기
JSON 파일 읽기 => RDBMS에 Insert 하기
RDBMS 테이블(쿼리) 읽기 => RDBMS에 Insert 하기
RDBMS 테이블(쿼리) 읽기 => RDBMS에 Update 하기
RDBMS 테이블(쿼리) 읽기 => FlatFile 로 저장하기


첫 시작이니 Hello World 부터 찍어보겠다.

이 포스트의 내용은 "스프링배치 완벽가이드" 내용에 근거해 있다.

개발환경 : 인텔리J
DBMS : mariaDB

1. 프로젝트 생성
  1) New Project > Spring Initializr > Next
  2) I/O 항목에서 Spring Batch, Validation 선택
  3) SQL 항목에서 JDBC API 및 MariaDB Driver 선택
  4) Developer Tools 에서 Lombok 선택
  5) Finish 클릭

2. 아래의 코드를 작성한다.

//batch 생성시 필수 어노테이션
@EnableBatchProcessing
@SpringBootApplication
public class BatchApplication {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    //스텝을 만든다.
    @Bean
    public Step step(){
        return this.stepBuilderFactory.get("step1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        // Hello, world 출력
                        System.out.println("Hello, world");
                        return RepeatStatus.FINISHED;
                    }
                }).build();
    }

    //잡을 만든다.
    @Bean
    public Job job() {
        return this.jobBuilderFactory.get("job1")
                .start(step())
                .build();
    }

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

}

3. resources 에 application.yml 파일을 생성한 후, mariadb conn 정보를 입력한다.

spring:
  datasource:
    url: jdbc:mariadb://localhost:3306/test_db
    username: {id}
    password: {password}
    driver-class-name: org.mariadb.jdbc.Driver
  batch:
    jdbc:
      initialize-schema: always #스키마가 없을경우 자동생성해준다.

4. BatchApplication 에 마우스 우클릭한 후, Run 으로 실행한다.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.4)

2022-03-20 22:46:00.081  INFO 16512 --- [           main] com.sunnier.batch.BatchApplication       : Starting BatchApplication using Java 1.8.0_202 on DESKTOP-AHN11RT with PID 16512 (C:\git_repo\batch\target\classes started by sunni in C:\git_repo\batch)
2022-03-20 22:46:00.081  INFO 16512 --- [           main] com.sunnier.batch.BatchApplication       : No active profile set, falling back to 1 default profile: "default"
2022-03-20 22:46:01.114  INFO 16512 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2022-03-20 22:46:01.185  INFO 16512 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2022-03-20 22:46:01.338  INFO 16512 --- [           main] o.s.b.c.r.s.JobRepositoryFactoryBean     : No database type set, using meta data indicating: MYSQL
2022-03-20 22:46:01.457  INFO 16512 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : No TaskExecutor has been set, defaulting to synchronous executor.
2022-03-20 22:46:01.629  INFO 16512 --- [           main] com.sunnier.batch.BatchApplication       : Started BatchApplication in 2.087 seconds (JVM running for 3.095)
2022-03-20 22:46:01.629  INFO 16512 --- [           main] o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: [foo=to]
2022-03-20 22:46:01.729  INFO 16512 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=job1]] launched with the following parameters: [{foo=to}]
2022-03-20 22:46:01.791  INFO 16512 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
Hello, world
2022-03-20 22:46:01.834  INFO 16512 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step1] executed in 43ms
2022-03-20 22:46:01.861  INFO 16512 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=job1]] completed with the following parameters: [{foo=to}] and the following status: [COMPLETED] in 112ms
2022-03-20 22:46:01.866  INFO 16512 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2022-03-20 22:46:01.878  INFO 16512 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
Disconnected from the target VM, address: '127.0.0.1:62720', transport: 'socket'

Process finished with exit code 0

5. Hello, world 라고 출력되는 부분을 확인한다.

※ jar 파일로 만들어 실행하고자 할 경우, Run/Debug Confiurations 에 Maven을 추가하고, Command line 에 "clean package" 를 넣으면 target 디렉토리에 Jar파일이 생성된다
(실행은 java -jar XXXX.jar)