Opencsv를 활용한 Spring Batch Custom tasklet

공부는 혼자하는 거·2023년 5월 25일
0

Spring Tip

목록 보기
40/52

별 건 없고, 회사에서 간단히 CSV 파일을 테이블 규격에 맞춰서 DB에 적재시키는 배치서버를 만들다가, OPENCSV 라이브러리 도움을 받은 게 있어서 공유해보고자 한다.


dependencies {

    // https://mvnrepository.com/artifact/com.opencsv/opencsv
    implementation group: 'com.opencsv', name: 'opencsv', version: '5.7.1'

    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.batch:spring-batch-test'
}

 public List<Dto> getItems(String filePath) {


        InputStream in = getClass().getResourceAsStream(filePath);
        InputStreamReader fileReader = new InputStreamReader(in, StandardCharsets.UTF_8);

        try (CSVReader reader = new CSVReaderBuilder(fileReader).withSkipLines(2).build()) {
            List<String[]> result = reader.readAll();
            List<Dto> dtos = result.stream().map(strings -> {
                List<String> list = Arrays.stream(strings).map(s1 -> {
                    return s1.replaceAll("\n", " ").trim();
                }).collect(Collectors.toList());
                if (!StringUtils.hasLength(list.get(1))) return null;
                return getDto(list);
            }).filter(a -> a != null).collect(Collectors.toList());
            return musicDtos;
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        return null;
    }
    

@Slf4j
@Component
@RequiredArgsConstructor
public class CustomTasklet implements Tasklet {

    private final DataRepository repository;

    private String filePath = "/~~";


    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        execute();
        return RepeatStatus.FINISHED;
    }

    public void execute(){
        List<Dto> items = new CsvUtil().getItems(filePath);
        List<MyEntity> collect = items.stream().map(Dto::toEntity).collect(Collectors.toList());
        repository.saveAll(collect);

    }


}


   	@Bean
    @JobScope
    public Step csvJob1_batchStep1() {
        return stepBuilderFactory.get("csvJob1_batchStep1")
                .tasklet(customTasklet)
                .build();
    }

CSV 파일을 읽을 때, 골칫거리 중 하나가 칼럼에 있는 줄바꿈인데, opencsv를 활용하면, 효과적으로 csv row 별로 읽을 수 있다.

profile
시간대비효율

0개의 댓글