IT/Live Coding

[springBoot] spring batch simple csvFileReader (ํ…Œ์ŠคํŠธ ์˜์ƒ & ์†Œ์Šค์ฝ”๋“œ ํฌํ•จ)

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2023. 11. 11.

์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ์ด์–ด์ง„ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

[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

๋Œ“๊ธ€