티스토리 뷰

전에 spring 프로젝트를 springboot 프로젝트로 migration 하는 과정을 기술한 적이 있다. 마찬가지로 현재 Spring Batch로 구성된 batch 프로젝트를 springboot batch로 전환을 하려고 한다. 두 프로젝트 모두 maven 기반의 프로젝트이고 전반적인 구성에 대한 소개보다는 migration point 에 대해서만 집중적으로 기술하도록 하겠다.

 

프로젝트 feature

전의 web 프로젝트와 동일하게 parent 프로젝트가 존재하고 module로 web, batch, common 등의 프로젝트가 child로 존재를 하는 상황이다. 또한 jdk 11, spring version은 4.3.12, spring batch version은 4.0.1, springboot의 version은 1.4.2 을 사용하는 상황이다. 또한 standalone 방식이 아니다. (Quartz Scheduler로 자체 스케쥴링)

 

pom.xml (parent)

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.4.2.RELEASE</version>
  <relativePath/>
</parent>


parent에는 여전히 spring-boot-starter-parent에 대한 설정이 필요하다. 

 

pom.xml (child)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

web project에는 spring-boot-starter-web 을 추가해 줬다면 batch project에는 spring-boot-starter-batch 를 추가한다. 또한 spring-boot-starter-validation도 추가하여 준다. 

 

 

BatchApplication.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource(value= {"classpath:spring/context-commandline.xml"})
public class BatchApplication {
	
    private static final String TIMESTAMP = "timestamp";
	
    public static void main(String[] args) {
    	List<String> param = new ArrayList<String>(Arrays.asList(args));
        param.add(TIMESTAMP + "=" + new Date().getTime());
    	SpringApplication application = new SpringApplication(BatchApplication.class);
    	application.run(param.toArray(new String[] {}));
    }
}

 

 

구글링을 했을때 다른 springboot batch에서는 @EnableBatchProcessing 를 필수로 설정을 해서 사용을 해야 한다고 되어 있는데 이것의 용도는 배치의 기본 설정을 잡아주는 것인데 기존에 돌던 배치를 migration 하는 것이므로 설정을 해주지 않아도 잘 동작하였다. 

springboot이기 때문에 springboot main class도 작성을 해야 한다. 일전에 했던 web application 구성처럼 일단은 xml config를 java config로 변환할 시간이 없었기에 기존의 xml config 를 참조하도록 설정하였다. context-commandline.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<import resource="classpath:/spring/context-batch.xml" />
	<import resource="classpath:/spring/context-dataaccess.xml" />
	<import resource="classpath:/spring/jobs/**/context-batch-job-*.xml" />
</beans>

 

batch 관련된 applicationContext 파일들을 가지고 있는 파일이며 이곳에 배치의 설정, job 들이 모두 있다. 이것 대신에 기존에 사용하고 있던 applicationContext file을 대신 import 해서 사용하면 된다. 

 

또한 위에 TIMESTAMP를 넣는 이유는 spring batch의 특성상 실행시킬때 항상 다른 param 값을 넣어줘야 하는데 이를 위해 넣어준 것이다. 이걸 넣지 않고 두번 돌리면 JobInstanceAlreadyCompleteException이 발생한다. 이 방식이 싫고 직접 arg에 추가를 하고 싶다면

Run Configurations > Spring Boot App > batch project > Program Arguments 에서 requestDate=20200529 이런식으로 date 값을 계속 변경해가면서 실행을 시켜 준다. 매번 변경해줘야 하는 귀찮음 때문에 위처럼 한것이다. 

 

이렇게 실행을 시키면 등록된 모든 job들이 springboot 실행시에 모두 실행이 된다. 특정 job만 기동시에 실행을 시키고 싶다면 위의 Program Arguments에 --spring.batch.job.names=job name(bean id) 을 추가해주면 된다.  기동시에는 아무것도 실행시키고 싶지 않다면 application.properties 파일에 spring.batch.job.enabled=false 로 설정을 하면 된다. 

 

위와 같이 하는 행동들은 local test에 적합하고 실제 job이 스케쥴링이 되는 시점에서는 사용할일이 없다.

 

또한 springboot batch는 실행이 되면 끝나지 않고 계속 대기중인 상태가 되므로 작업이 끝났다면 강제로 종료를 해줄 필요가 있다. 이럴때는 다음과 같이 종료를 시켜준다. 

 

BatchApplication.java

System.exit(SpringApplication.exit(SpringApplication.run(BootBatchApplication.class, params.toArray(new String[0]))););

 

 

logback-spring.xml

 

web application migration과 마찬가지로 logback.xml 파일에 대해서도 migration이 필요하다. 이건 다음을 참고한다. 

 

 

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (4) - logback

2020/05/13 - [framework/Springboot] - spring 프로젝트에서 springboot 프로젝트로 migration 하기 (1) - pom.xml 2020/05/13 - [framework/Springboot] - spring 프로젝트에서 springboot 프로젝트로 migration..

oingdaddy.tistory.com

 

위의 과정을 거치면 spring batch 프로젝트를 springboot batch 프로젝트로 전환을 할 수 있다. 

 

 

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
«   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