diff --git a/pom.xml b/pom.xml
index 38d49b1..7445dab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,29 +14,42 @@
spring-batch-lecture
Demo project for Spring Boot
- 11
+ 1.8
org.springframework.boot
spring-boot-starter-batch
-
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
mysql
mysql-connector-java
runtime
- org.springframework.boot
- spring-boot-configuration-processor
- true
+ com.h2database
+ h2
+ runtime
org.projectlombok
lombok
true
+
+ org.springframework
+ spring-oxm
+ 5.3.7
+
+
+ com.thoughtworks.xstream
+ xstream
+ 1.4.16
+
org.springframework.boot
spring-boot-starter-test
diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java
new file mode 100644
index 0000000..8de4b51
--- /dev/null
+++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java
@@ -0,0 +1,108 @@
+package io.springbatch.springbatchlecture;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.batch.core.*;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.batch.core.launch.support.RunIdIncrementer;
+import org.springframework.batch.item.*;
+import org.springframework.batch.item.adapter.ItemWriterAdapter;
+import org.springframework.batch.item.support.ClassifierCompositeItemProcessor;
+import org.springframework.batch.item.support.CompositeItemProcessor;
+import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder;
+import org.springframework.batch.repeat.CompletionPolicy;
+import org.springframework.batch.repeat.RepeatCallback;
+import org.springframework.batch.repeat.RepeatContext;
+import org.springframework.batch.repeat.RepeatStatus;
+import org.springframework.batch.repeat.exception.SimpleLimitExceptionHandler;
+import org.springframework.batch.repeat.policy.CompositeCompletionPolicy;
+import org.springframework.batch.repeat.policy.SimpleCompletionPolicy;
+import org.springframework.batch.repeat.policy.TimeoutTerminationPolicy;
+import org.springframework.batch.repeat.support.RepeatTemplate;
+import org.springframework.classify.PatternMatchingClassifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RequiredArgsConstructor
+@Configuration
+public class RepeatConfiguration {
+
+ private final JobBuilderFactory jobBuilderFactory;
+ private final StepBuilderFactory stepBuilderFactory;
+
+ @Bean
+ public Job job() throws Exception {
+ return jobBuilderFactory.get("batchJob")
+ .incrementer(new RunIdIncrementer())
+ .start(step1())
+ .build();
+ }
+
+ @Bean
+ public Step step1() throws Exception {
+ return stepBuilderFactory.get("step1")
+ .chunk(5)
+ .reader(new ItemReader() {
+ int i = 0;
+ @Override
+ public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
+ i++;
+ return i > 3 ? null : "item" + i;
+ }
+ })
+ .processor(new ItemProcessor() {
+
+ RepeatTemplate template = new RepeatTemplate();
+
+ @Override
+ public String process(String item) throws Exception {
+
+ // 반복할 때마다 count 변수의 값을 1씩 증가
+ // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료
+// template.setCompletionPolicy(new SimpleCompletionPolicy(2));
+ // 소요된 시간이 설정된 시간보다 클 경우 반복문 종료
+// template.setCompletionPolicy(new TimeoutTerminationPolicy(3000));
+
+ // 여러 유형의 CompletionPolicy 를 복합적으로 처리함
+ // 여러 개 중에 먼저 조건이 부합하는 CompletionPolicy 에 따라 반복문이 종료됨
+// CompositeCompletionPolicy completionPolicy = new CompositeCompletionPolicy();
+// CompletionPolicy[] completionPolicies = new CompletionPolicy[]{new TimeoutTerminationPolicy(3000),new SimpleCompletionPolicy(2)};
+// completionPolicy.setPolicies(completionPolicies);
+// template.setCompletionPolicy(completionPolicy);
+
+ // 예외 제한 횟수만큼 반복문 실행
+ template.setExceptionHandler(simpleLimitExceptionHandler());
+
+ template.iterate(new RepeatCallback() {
+
+ public RepeatStatus doInIteration(RepeatContext context) {
+ System.out.println("repeatTest");
+ throw new RuntimeException("Exception is occurred");
+// return RepeatStatus.CONTINUABLE;
+ }
+
+ });
+
+ return item;
+ }
+ })
+ .writer(new ItemWriter() {
+ @Override
+ public void write(List extends String> items) throws Exception {
+ System.out.println(items);
+ }
+ })
+ .build();
+ }
+
+ @Bean
+ public SimpleLimitExceptionHandler simpleLimitExceptionHandler(){
+ return new SimpleLimitExceptionHandler(2);
+ }
+}
+
diff --git a/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java b/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java
index 0d8b2d4..8930a69 100644
--- a/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java
+++ b/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java
@@ -1,9 +1,11 @@
package io.springbatch.springbatchlecture;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
+@EnableBatchProcessing
public class SpringBatchLectureApplication {
public static void main(String[] args) {
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
deleted file mode 100644
index 8b13789..0000000
--- a/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..4fb13ef
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,37 @@
+spring:
+ profiles:
+ active: local
+ batch:
+ job:
+# enabled: false
+ names: ${job.name:NONE}
+
+---
+spring:
+ config:
+ activate:
+ on-profile: local
+ datasource:
+ hikari:
+ jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+ username: sa
+ password:
+ driver-class-name: org.h2.Driver
+ batch:
+ jdbc:
+ initialize-schema: embedded
+
+---
+spring:
+ config:
+ activate:
+ on-profile: mysql
+ datasource:
+ hikari:
+ jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&characterEncoding=utf8
+ username: root
+ password: pass
+ driver-class-name: com.mysql.jdbc.Driver
+ batch:
+ jdbc:
+ initialize-schema: always
\ No newline at end of file
diff --git a/src/main/resources/customer.json b/src/main/resources/customer.json
new file mode 100644
index 0000000..e69de29