잘 정리해보자
Spring Batch - csv파일 읽기 (FlatFileItemReader) 본문
FlatFileItemReader
: 파일 읽을 수 있는 클래스
간단하게 아래와 같은 3개 필드로 구성된 csv파일을 읽는 테스트를 진행한다. (infotemp.csv)
id | name | address |
1 | wow | seoul |
2 | chois | incheon |
3 | lee | seoul |
시작 전에 csv파일과 매핑될 vo를 정의한다.
TestCsvFieldVo.java
@Getter @Setter
public class TestCsvFieldVo {
private int id;
private String name;
private String address;
public TestCsvFieldVo(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
}
Job과 step을 선언 후, reader 부분에 csv파일을 읽는 FlatFileItemReader 로 정의한다.
public FlatFileItemReader<TestCsvFieldVo> csvFileReader() {
DefaultLineMapper<TestCsvFieldVo> lineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("id","name","address");
lineMapper.setLineTokenizer(tokenizer);
...
}
DefaultLineMapper
: csv파일을 한 줄씩 읽게 하는 객체
DelimitedLineTokenizer
: csv파일을 mapper에 매핑하기 위해서 tokenizer 선언 필요
tokenizer에 csv필드를 매핑하려면 .setNames("필드1","필드2",...) 해줘야 한다.
...
lineMapper.setFieldSetMapper(fieldSet -> {
int id = fieldSet.readInt("id"); //id 읽기
String name = fieldSet.readString("name"); //name 읽기
String address = fieldSet.readString("address"); //address 읽기
return new TestCsvFieldVo(id,name,address); //vo로 리턴
});
...
FlatFileItemReader reader = new FlatFileItemReaderBuilder<TestCsvFieldVo>()
.name("csvItemReader")
.encoding("UTF-8")
.resource(new ClassPathResource("infotemp.csv")) //csv파일
.linesToSkip(1) //1번쨰 필드명 부분 skip
.lineMapper(lineMapper)
.build();
ClassPathResource
: resources 파일 밑 디렉토리를 읽는 클래스
(파일을 resources 디렉토리 아래에 두고 read한다. )
.lineToSkip(int num)
: csv파일 경우 보통 첫번째 필드값이 나타날때 1째 row를 skip을 한다.
reader 부분 소스
@Bean
@StepScope
public FlatFileItemReader<TestCsvFieldVo> csvFileReader() throws Exception {
DefaultLineMapper<TestCsvFieldVo> lineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("id","name","address");
lineMapper.setLineTokenizer(tokenizer);
lineMapper.setFieldSetMapper(fieldSet -> {
int id = fieldSet.readInt("id");
String name = fieldSet.readString("name");
String address = fieldSet.readString("address");
return new TestCsvFieldVo(id,name,address);
});
FlatFileItemReader reader = new FlatFileItemReaderBuilder<TestCsvFieldVo>()
.name("csvItemReader")
.encoding("UTF-8")
.resource(new ClassPathResource("infotemp.csv"))
.linesToSkip(1)
.lineMapper(lineMapper)
.build();
//itemreader에서 필요한 설정들이 제대로 됬는지 검증하는 함수 (throw Exception으로 넘김)
reader.afterPropertiesSet();
return reader;
}
1줄씩 read후 write로 로그 남긴 실행 결과
'Spring > Spring Boot' 카테고리의 다른 글
Comments