반응형
FlatFileItemWriter를 이용해 CSV 파일에 데이터를 작성하는 연습을 합니다.
이 클래스는 데이터가 매핑된 객체를 파일로 write 합니다.
이 CSV 파일을 사용하기 위해선 BeanWrapperFiledExtractor클래스가 필요합니다.
@Configuration
@Slf4j
public class ItemWriterConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public ItemWriterConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job itemWriterJob() {
return this.jobBuilderFactory.get("itemWriterJob")
.incrementer(new RunIdIncrementer())
.start(this.csvitemWriterStep())
.build();
}
@Bean
public Step csvitemWriterStep() {
return this.stepBuilderFactory.get("itemWriterStep")
.<Person,Person>chunk(10)
.reader(itemReader())
.writer(csvitemWriter())
.build();
}
private ItemWriter<Person> csvitemWriter() {
BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<>();
fieldExtractor.setNames(new String[]{"id","name","age","address"});
return null;
}
private ItemReader<Person> itemReader() {
return new CustomItemReader<>(getItems());
}
private List<Person> getItems() {
List<Person> items = new ArrayList<>();
for (int i = 0; i < 100; i++) {
items.add(new Person(i + 1, "test_name", "test age", "test_address"));
}
return items;
}
}
Person을 기준으로 필드명을 설정해주어야 합니다. {id, name, age, address}
각 필드에 데이터를 하나의 라인에 작성하기 위해 구분 값을 설정해 주어야 합니다.
이때 DelimitedLineAggregator를 사용합니다.
만들어준 fieldExtractor를 주입해 매핑 설정을 마무리해줍니다.
@Configuration
@Slf4j
public class ItemWriterConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public ItemWriterConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job itemWriterJob() throws Exception {
return this.jobBuilderFactory.get("itemWriterJob")
.incrementer(new RunIdIncrementer())
.start(this.csvItemWriterStep())
.build();
}
@Bean
public Step csvItemWriterStep() throws Exception {
return this.stepBuilderFactory.get("itemWriterStep")
.<Person,Person>chunk(10)
.reader(itemReader())
.writer(csvFileItemWriter())
.build();
}
private ItemWriter<Person> csvFileItemWriter() throws Exception {
BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<>();
fieldExtractor.setNames(new String[]{"id","name","age","address"}); //필드명
DelimitedLineAggregator<Person> lineAggregator = new DelimitedLineAggregator<>();
lineAggregator.setDelimiter(",");
lineAggregator.setFieldExtractor(fieldExtractor);
FlatFileItemWriter<Person> itemWriter = new FlatFileItemWriterBuilder<Person>()
.name("csvFileItemWriter")
.encoding("UTF-8")
.resource(new FileSystemResource("output/test-output.csv")) //파일 생성하기 위함
.lineAggregator(lineAggregator)
.build();
itemWriter.afterPropertiesSet();
return itemWriter;
}
private ItemReader<Person> itemReader() {
return new CustomItemReader<>(getItems());
}
private List<Person> getItems() {
List<Person> items = new ArrayList<>();
for (int i = 0; i < 100; i++) {
items.add(new Person(i + 1, "test_name", "test age", "test_address"));
}
return items;
}
}
그럼 output폴더 안에 test-output파일이 존재합니다.
CSV 파일이 만들어지고 만들어진 데이터가 들어간 것을 확인할 수 있습니다.
그럼 이제 헤더와 푸터를 설정해보겠습니다.
이렇게 되면 같은 이름으로 2번 실행된 것입니다. 방금 실행으로 파일이 덮어쓰기가 된 것입니다.
새로운 파일이 어펜더 되는 설정을 추가할 것입니다.
단순히 itemWriter에 append(true) 설정을 추가하고 푸터의 개행 문자를 추가해주어야 합니다 \n
개행이 잘된 것을 확인했습니다.
반응형
'Spring|Spring-boot > Spring Batch' 카테고리의 다른 글
Spring Batch JpaItemWriter (0) | 2021.03.06 |
---|---|
Spring Batch JdbcBatchItemWriter (0) | 2021.03.06 |
Spring Batch ItemReader (0) | 2021.03.06 |
Spring Batch Parameter (0) | 2021.02.28 |
Spring Batch Architecture (0) | 2021.02.27 |
댓글