본문 바로가기
Spring|Spring-boot/Spring Batch

Spring Batch ItemWriter

by oncerun 2021. 3. 6.
반응형

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

댓글