Spring Batch

[Spring Batch] ItemReader

오늘도개발 2024. 5. 7. 10:01

1. ItemReader 란?

 

  - chunk 기반 작업에서 데이터를 읽어 들일 때, 사용하는 인터페이스

  - 호출시 하나의 결과 데이터를 반환 ( null 이 나올 때 까지 ) 

 

 

2.ItemReader 종류

 

  •   FlatFileItemReader : 파일의 고정 위치로 정의되거나 일부 특수 문자(예: 쉼표)로 구분된 데이터 필드가 있는 레코드 
    • LineMapper : 단위 구분
    • LineTokenizer : 데이터를 구분자 기준으로 토큰화
    • FieldSetMapper : 객체로 매핑할 때 사용
    • 예시 코드
Resource resource = new FileSystemResource("resources/rawdata.csv");


public class DefaultLineMapper<T> implements LineMapper<>, InitializingBean {

    private LineTokenizer tokenizer;

    private FieldSetMapper<T> fieldSetMapper;

    public T mapLine(String line, int lineNumber) throws Exception {
        return fieldSetMapper.mapFieldSet(tokenizer.tokenize(line));
    }

    public void setLineTokenizer(LineTokenizer tokenizer) {
        this.tokenizer = tokenizer;
    }

    public void setFieldSetMapper(FieldSetMapper<T> fieldSetMapper) {
        this.fieldSetMapper = fieldSetMapper;
    }
}

 

 

public class Student implements Serializable {
    private Long id;
    private String name;
    private int birthYear;

    public String toString() {
        return "student:ID=" + id + ",name=" + name +
            ",birth Year=" + birthYear ;
    }
}


protected static class StudentFieldSetMapper implements FieldSetMapper<Student> {
    public Student mapFieldSet(FieldSet fieldSet) {
        Student student = new Student();

        Student.setID(fieldSet.readLong(0));
        Student.setName(fieldSet.readString(1));
        Student.setBirthYear(fieldSet.readInt(2));

        return student;
    }
}


FlatFileItemReader<Student> itemReader = new FlatFileItemReader<>();
itemReader.setResource(new FileSystemResource("resources/rawdata.csv"));
DefaultLineMapper<Student> lineMapper = new DefaultLineMapper<>();
lineMapper.setLineTokenizer(new DelimitedLineTokenizer());
lineMapper.setFieldSetMapper(new StudentFieldSetMapper());
itemReader.setLineMapper(lineMapper);
itemReader.open(new ExecutionContext());
Student student = itemReader.read();

 

  •   StaxEventItemReader : xml 사용 데이터 Reader

 

  • DataBase
    • JdbcCursorItemReader : 커서를 기반으로 read
    • 예시 코드
@Bean
public JdbcCursorItemReader<Student> itemReader() {
	return new JdbcCursorItemReaderBuilder<Student>()
			.dataSource(this.dataSource)
			.name("studentReader")
			.sql("SELECT id, name, birthyear FROM student")
			.rowMapper(new CustomStudentRowMapper())
			.build();

}


public class CustomStudentRowMapper implements RowMapper<Student> {

    public static final Long ID_COLUMN = "id";
    public static final String NAME_COLUMN = "name";
    public static final Integer BIRTHYEAR_COLUMN = "birthyear";

    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
        Student student = new Student();

        student.setId(rs.getBigDecimal(ID_COLUMN));
        student.setName(rs.getString(NAME_COLUMN));
        student.setBirthyear(rs.getInt(BIRTHYEAR_COLUMN));

        return student;
    }
}

 

 

  • JdbcPagingItemReader: Paging 기반으로 read (Thread-safe 함)
  • 예시 코드
@Bean
public JdbcPagingItemReader itemReader(DataSource dataSource, PagingQueryProvider queryProvider) {
	Map<String, Object> parameterValues = new HashMap<>();
	parameterValues.put("status", "NEW");

	return new JdbcPagingItemReaderBuilder<Student>()
           				.name("studentReader")
           				.dataSource(dataSource)
           				.queryProvider(queryProvider)
           				.parameterValues(parameterValues)
           				.rowMapper(studentCreditMapper())
           				.pageSize(1000)
           				.build();
}

@Bean
public SqlPagingQueryProviderFactoryBean queryProvider() {
	SqlPagingQueryProviderFactoryBean provider = new SqlPagingQueryProviderFactoryBean();

	provider.setSelectClause("select id, name, birthyear");
	provider.setFromClause("from student");
	provider.setWhereClause("where status=:status");
	provider.setSortKey("id");

	return provider;
}

 

'Spring Batch' 카테고리의 다른 글

[Spring Batch] JobScope, StepScope  (0) 2024.05.07
[Spring Batch] ItemWriter  (0) 2024.05.07
[Spring Batch] ItemProcessor  (0) 2024.05.07
[Spring Batch] Job 과 Step  (0) 2024.05.06
[Spring Batch] 스프링 배치 란?  (0) 2024.05.06