본문 바로가기

Web/spring

[String Batch] FlatFileItemReader

728x90

FlatFileItemReader는 Spring Batch에서 파일을 읽어오는 ItemReader 이다

 

 

 

예시코드

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Autowired
    public BatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    public FlatFileItemReader<Person> reader() {
        FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
        reader.setResource(new ClassPathResource("people.csv")); // 파일 위치 지정
        reader.setLineMapper(new DefaultLineMapper<Person>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[]{"firstName", "lastName", "email"});
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }});
        }});
        return reader;
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
                .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
                .sql("INSERT INTO people (first_name, last_name, email) VALUES (:firstName, :lastName, :email)")
                .dataSource(dataSource)
                .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
                .<Person, Person>chunk(10)
                .reader(reader())
                .processor(processor())
                .writer(writer)
                .build();
    }

    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
                .incrementer(new RunIdIncrementer())
                .listener(listener)
                .flow(step1)
                .end()
                .build();
    }
}

 

 

people.csv 파일에서 firstName, lastName, email을 읽어와 Person 객체로 매핑한다

이후 PersonItemProcessor를 거쳐 JDBC를 통해 데이터베이스에 저장한다.

FlatFileItemReader의 setResource() 메소드를 사용하여 파일 위치를 지정하고, setLineMapper() 메소드를 사용하여 읽어온 라인을 객체로 매핑한다.

setLineTokenizer()은 라인을 파싱하는 데 사용되는 토크나이저를 설정하고, setFieldSetMapper()는 파싱된 결과를 객체로 매핑하는 데 사용된다.

최종적으로 reader(), processor(), writer() 메소드를 step1()에서 하나로 묶어 Job을 만들어 실행한다

728x90