잘 정리해보자

Spring Batch - csv파일 읽기 (FlatFileItemReader) 본문

Spring/Spring Boot

Spring Batch - csv파일 읽기 (FlatFileItemReader)

토마토오이 2022. 1. 21. 00:51

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로 로그 남긴 실행 결과

 

Comments