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 |