반응형
2018/10/12 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_01
저번 분석에서는 Job에 대해서 알아보았습니다.
이제 Step에 대해 알아보도록 하겠습니다.
설명하고 있는 소스는 https://spring.io/guides/gs/batch-processing/ 를 참고!
// tag::jobstep[]
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
// end::jobstep[]
- Step의 메소드명은 step1
- 파라미터는 JdbcBatchItemWriter<Person> writer
- return은 stepBuilder
- builder에는 아래와 같이 구성.
- stepBuilderFactory.get
- chunk
- reader
- processor
- writer
- 내용을 파악하기 전에 SpringBatch의 Flow를 파악해보면 좋을것 같다.
왜? 나는 chunk, reader, processor, writer를 알아야하는가?에 대한 답변이 될꺼라 생각한다. - SpringBatch Flow
- 이제 하나하나씩 알아가보자.
- chunk를 보자.
- 우선 chunk(청크)란 배치선 덩어리 데이터들을 단위별로 묶어서 처리되어지는 수!
즉, 위에 10이라는 뜻은 10개를 모아서 Chuck단위(10)로 트랜잭션을 이루고 있다고 보면 된다.
트랜잭션 수행이기 때문에 실패 시 Chunk단위로 롤백이되고, 이전에 커밋된 트랜잭션까지는 반영이 된다는 뜻이다. - <Person, Person> chunk(10)에서 <Person, Person>은 제네릭 타입으로
각 청크의 input과 output type을 나타낸다. - ItemReader<Person>과 ItemWriter<Person>로 생각하면 된다.
- reader(reader())를 보자.
- reader? 뜻 그대로 읽어들이는 것이다. 무엇을? 데이터를~(txt, api, db 등등등)
@Bean public FlatFileItemReader<Person> reader() { return new FlatFileItemReaderBuilder<Person>() .name("personItemReader") .resource(new ClassPathResource("sample-data.csv")) .delimited() .names(new String[]{"firstName", "lastName"}) .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{ setTargetType(Person.class); }}) .build(); }
- 위의 FlatFileItemReader는 SpringBatch에서 제공해주는 녀석이다.
json, xml 형태가 아닌 말그대로 flat file을 읽어들인다.import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
- FlatFileItemReaderBuilder! 이녀석 또한 Builder Pattern.
- name : reader instance명
- resource : 근원지 즉, read할 flat file.
- delimited() : 명시적이지 않을 때 사용!
DelimitedLineTokenizer를 작성하기위한 FlatFileItemReaderBuilder.DelimitedBuilder의 인스턴스를 리턴합니다. 이 빌더에 의해 구성된 DelimitedLineTokenizer는 lineTokenizer를 통해 명시적으로 구성되지 않은 경우에만 사용됩니다. - names : sample-data.csv의 내용과 names에서 선언한 포맷에 맞게 들어오게 되며 이 데이터는
- fieldSetMapper()를 통해 DTO에 매핑 되어진다.
- 예를 들어 아래의 데이터 중 Jane, Doe라고 한다면 String[]{"firstName", "lastName"}에 담긴다는 것이고 이것은 fieldSetMapper를 통해 객체에 담기게 된다.
- 제공 되는 구현 클래스들
AddressFieldSetMapper, AggregateItemFieldSetMapper, ArrayFieldSetMapper,
BeanWrapperFieldSetMapper, BillingFieldSetMapper, CustomerCreditFieldSetMapper,
CustomerFieldSetMapper, CustomerUpdateFieldSetMapper, GameFieldSetMapper,
HeaderFieldSetMapper, OrderItemFieldSetMapper, PassThroughFieldSetMapper,
PlayerFieldSetMapper, ShippingFieldSetMapper, TradeFieldSetMapper - 이중 우리는 BeanWrapperFieldSetMapper 을 사용.
- setTargetType : property가 아닌 Bean을 설정. 여기에서는 Person.class
public class Person { private String lastName; private String firstName; 이하 생략..
- processor(processor)
- PersonItemProcessor는 ItemProcessor의 구현체이다.
- Person객체를 input으로 하여 가공한 뒤에 output으로 Person을 리턴한다.
@Bean public PersonItemProcessor processor() { return new PersonItemProcessor(); }
package hello; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.batch.item.ItemProcessor; public class PersonItemProcessor implements ItemProcessor<Person, Person> { private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class); @Override public Person process(final Person person) throws Exception { final String firstName = person.getFirstName().toUpperCase(); final String lastName = person.getLastName().toUpperCase(); final Person transformedPerson = new Person(firstName, lastName); log.info("Converting (" + person + ") into (" + transformedPerson + ")"); return transformedPerson; } }
- 정리하면 processor의 역할은 read한 것을 가공하여 write에 주는 것이다.
- writer(writer)
- 이제 마지막으로 writer입니다.
여기에서는 데이터베이스 관련 writer중 JdbcBatchItemWriter가 사용되어집니다.
@Bean
public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Person>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
.dataSource(dataSource)
.build();
}
- JdbcBatchItemWriterBuilder가 사용.
- itemSqlParameterSourceProvider()
- 작성자가 사용할 ItemSqlParameterSourceProvider를 구성합니다.
beanMapped ()가 호출되지 않은 경우에만 사용해야합니다. - BeanPropertyItemSqlParmeterSourceProvider
- SQL구문에서 파라미터에 사용되어지는 명명 중 JavaBean(Person)에 속성에 해당되면
제공하여준다. - sql : sql구문
- dataSource : @EnableBatchProcessing에 의해 생성.
반응형
'OpenSource > Spring Batch' 카테고리의 다른 글
springboot 2.x 이상 springbatch table문제 해결 방법! (0) | 2020.08.13 |
---|---|
springbatch setting시 오류: Spring Boot plugin requires Gradle 5 (5.6.x only) or Gradle 6 (6.3 or later). The current version is Gradle 4.10.3 (0) | 2020.08.06 |
Spring Boot + Spring Batch 분석_01 (0) | 2018.10.12 |
SpringBatch 예제 (0) | 2018.09.12 |
MyBatisPagingItemReader를 사용할 때 유의점 (0) | 2015.10.02 |