별 건 없고, 회사에서 간단히 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 별로 읽을 수 있다.