IT/development

[springBoot] spring batch simple csvFileReader (feat. file)

알 수 없는 사용자 2023. 11. 11. 10:46
반응형

목차

    아래 포스팅에서 이어진 내용입니다.

     

    [springBoot] spring batch write to new file (feat. file)

    아래 포스팅에서 이어진 내용입니다. [springBoot] spring batch simpleTextReader 아래 포스팅에서 이어진 내용입니다. [springBoot] spring batch simpleReader insert other table( feat. JPA) 아래 포스팅에서 이어진 내용입

    yaga.tistory.com


    구분자 있는 csv파일을 읽어서 로그 출력하는 단순한 예제

    CsvJob1 😊

    package com.test.lsy.batchsimpledbreader.batch;
    
    import com.test.lsy.batchsimpledbreader.dto.CsvDto;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.Step;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.item.file.FlatFileItemReader;
    import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
    import org.springframework.batch.item.file.mapping.DefaultLineMapper;
    import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.ClassPathResource;
    
    @Slf4j
    @RequiredArgsConstructor
    @Configuration
    public class CsvJob1 {
    
        private final JobBuilderFactory jobBuilderFactory;
        private final StepBuilderFactory stepBuilderFactory;
        private static final int chunkSize = 5;
    
        //이제 스텝을 호출할 job 생성
        @Bean
        public Job csvJob1_batchBuild() {
            return jobBuilderFactory.get("csvJob1")
                    .start(csvJob1_batchStep())
                    .build();
        }
    
        //이제 스텝
        @Bean
        public Step csvJob1_batchStep() {
            return stepBuilderFactory.get("csvJob1_batchStep")
                    .<CsvDto, CsvDto>chunk(chunkSize)
                    .reader(csvJob1_FileReader())
                    .writer(CsvDto -> CsvDto.forEach(csvDto -> {
                        //여기선 단순히 루프 돌며 로그만 출력
                        log.debug("csvDto = [{}]", csvDto.toString());
                    }))
                    .build();
    
        }
    
        // reader
        @Bean
        public FlatFileItemReader<CsvDto> csvJob1_FileReader() {
            //리더 객체 생성
            FlatFileItemReader<CsvDto> flatFileItemReader = new FlatFileItemReader<>();
            //읽어올 csv파일 경로(클래스패스가 보통 resources 여기임)
            flatFileItemReader.setResource(new ClassPathResource("sample/csvJob1_input.csv"));
            //1번 째 라인은 보통 헤더(제목)이므로 읽을 때 생략
            flatFileItemReader.setLinesToSkip(1);
            //라인을 읽기 위한 객체
            DefaultLineMapper<CsvDto> defaultLineMapper = new DefaultLineMapper<>();
            //구분자를 위한 객체
            DelimitedLineTokenizer delimitedLineTokenizer = new DelimitedLineTokenizer();
            //Dto에 있는 필드와 매핑(1번 째 토큰부터 순서대로 Dto의 필드에 매핑)
            delimitedLineTokenizer.setNames("one", "two");
            //구분자를 기준으로 데이터를 자를거야(csv의 구분자 설정)
            delimitedLineTokenizer.setDelimiter(":");
            //데이터를 넣기 위한 객체
            BeanWrapperFieldSetMapper<CsvDto> beanWrapperFieldSetMapper = new BeanWrapperFieldSetMapper<>();
            //TwoDto가 타깃이야(여기에 데이터를 넣을거야)
            beanWrapperFieldSetMapper.setTargetType(CsvDto.class);
            //구분자 설정된 객체
            defaultLineMapper.setLineTokenizer(delimitedLineTokenizer);
            //어떤 필드에 넣을지 설정된 객체
            defaultLineMapper.setFieldSetMapper(beanWrapperFieldSetMapper);
            //구분자와 필드를 설정한 객체를 최종적으로 세팅
            flatFileItemReader.setLineMapper(defaultLineMapper);
            //최종적으로 Dto를 담은 객체를 반환
            return flatFileItemReader;
        }
    }

    CsvDto 🤗

    package com.test.lsy.batchsimpledbreader.dto;
    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;
    
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    //구분자가 있는 파일을 읽기 위함
    public class CsvDto {
    
        private String one;
        private String two;
    
        @Override
        public String toString() {
            return one + two;
        }
    }

    csvJob1_input.csv
    0.00MB


    개인 스터디 기록을 메모하는 공간이라 틀린점이 있을 수 있습니다.

    틀린 점 있을 경우 댓글 부탁드립니다.

    reference: https://www.youtube.com/watch?v=wy99cPHlMlA&list=PLogzC_RPf25HRSG9aO7qKrwbT-EecUMMR


    다음 내용

     

    [springBoot] spring batch csvFileReader write new File (feat. file)

    목차 아래 포스팅에서 이어진 내용입니다. [springBoot] spring batch simple csvFileReader (feat. file) 목차 아래 포스팅에서 이어진 내용입니다. [springBoot] spring batch write to new file (feat. file) 아래 포스팅에서

    yaga.tistory.com

    반응형