Spring Batch - ItemReader

출처

목차

ItemReader

ItemReader는 스텝 내에서 사용될 데이터를 읽는 역할을 합니다. ItemReader는 스텝이 시작될 때 호출되며, 데이터 소스에서 데이터를 읽어 Chunk 단위로 ItemProcessor에 전달합니다.

ItemReader는 일반적으로 파일, 데이터베이스 또는 메시징 시스템과 같은 외부 데이터 소스에서 데이터를 읽는 데 사용됩니다. Spring Batch는 다양한 유형의 ItemReader를 지원하며, 일반적으로 사용되는 ItemReader 유형은 다음과 같습니다.

  • FlatFileItemReader: CSV, 고정 길이 또는 구분 기호로 구분된 파일에서 데이터를 읽는 데 사용됩니다.
  • JdbcCursorItemReader: JDBC 쿼리를 실행하고 ResultSet에서 데이터를 읽는 데 사용됩니다.
  • JpaPagingItemReader: JPA를 사용하여 페이징 처리를 수행하고 데이터를 읽는 데 사용됩니다.
  • StaxEventItemReader: XML 데이터를 읽는 데 사용됩니다.
  • JmsItemReader: JMS 대기열에서 데이터를 읽는 데 사용됩니다.

다수의 구현체들이 ItemReader 와 ItemStream 을 동시에 구현하고 있습니다. ItemStream 은 파일의 스트림을 열거나 종료, DB 커넥션을 열거나 종료, 출력 장치 초기화 등의 작업을 진행합니다.

ItemReader 인터페이스

public interface ItemReader<T> {
@Nullable
T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
}

ItemReader 구현체

FlatFileItemReader

FlatFileItemReader는 파일에서 데이터를 읽어오기 위해 사용됩니다. 입력 파일은 다양한 형식의 텍스트 파일일 수 있으며, 일반적으로 CSV(Comma-Separated Values) 또는 고정 길이 형식의 파일을 처리하는 데 사용됩니다.

FlatFileItemReader는 Spring의 Resource 추상화를 사용하여 파일에 대한 참조를 가져오며, 구성 가능한 구분자 및 헤더/푸터 처리 기능을 제공합니다. 또한, 파일의 각 레코드를 Java 객체로 변환하여 반환할 수 있으므로, 이를 통해 다른 스프링 배치 구성 요소에서 사용할 수 있는 유용한 데이터 모델을 만들 수 있습니다.

FlatFileItemReaderBuilder

  • saveState(boolean saveState)

    • FlatFileItemReader의 상태를 저장할지 여부를 설정합니다. true로 설정하면 상태가 저장되어 재시작 시 이전 상태로 복구됩니다.
  • name(String name)

    • FlatFileItemReader의 이름을 설정합니다. 이 이름은 스텝 구성에서 사용될 수 있습니다.
  • maxItemCount(int maxItemCount)

    • 최대 읽기 아이템 수를 설정합니다. 이 값을 설정하면 지정된 수만큼 아이템을 읽은 후 리더가 끝납니다.
  • currentItemCount(int currentItemCount)

    • 현재 읽은 아이템 수를 설정합니다. 이 값을 설정하면 리더가 재시작될 때 이전 상태로 복구됩니다.
  • addComment(String comment)

    • 주석(comment)을 추가합니다. 이 주석은 읽기 프로세스의 로깅이나 디버깅에 사용될 수 있습니다.
  • comments(String... comments

    • 다중 주석(comments)을 추가합니다.
  • recordSeparatorPolicy(RecordSeparatorPolicy policy)

    • 레코드 구분 정책(RecordSeparatorPolicy)을 설정합니다. 레코드 구분 정책은 행 사이의 구분자를 기반으로 레코드를 식별하는 데 사용됩니다.
  • bufferedReaderFactory(BufferedReaderFactory factory)

    • BufferedReaderFactory를 설정하여 FlatFileItemReader에서 사용할 BufferedReader를 생성합니다. 사용자 지정 BufferedReader를 사용할 수 있습니다.
  • resource(Resource resource)

    • 읽을 리소스(Resource)를 설정합니다. 파일 시스템 경로, 클래스패스 리소스 등을 지정할 수 있습니다.
  • strict(boolean strict)

    • 엄격 모드(strict mode)를 설정합니다. 엄격 모드에서는 입력 행에 예상되는 필드 수보다 적은 필드가 있는 경우 예외가 발생합니다.
  • encoding(String encoding)

    • 읽을 파일의 인코딩을 설정합니다.
  • linesToSkip(int linesToSkip)

    • 읽기 시작 시 건너뛸 행 수를 설정합니다. 파일의 처음 몇 행을 건너뛰고 데이터를 읽을지 결정할 수 있습니다.
  • skippedLinesCallback(LineCallbackHandler callback)

    • 건너뛴 행에 대한 콜백 처리를 설정합니다. 건너뛴 행의 내용을 처리할 수 있습니다.
  • lineMapper(LineMapper<T> lineMapper)

    • 행을 도메인 객체로 매핑하는 LineMapper를 설정합니다.
  • fieldSetMapper(FieldSetMapper<T> mapper)

    • FieldSetMapper를 설정하여 필드 세트를 도메인 객체로 매핑합니다.
  • lineTokenizer(LineTokenizer tokenizer)

    • 행을 필드로 분리하는 LineTokenizer를 설정합니다.
  • public DelimitedBuilder<T> delimited()

    • 구분자(delimiter) 기반의 필드 구성을 위한 DelimitedBuilder를 반환합니다.
  • public FixedLengthBuilder<T> fixedLength()

    • 고정 길이 필드 구성을 위한 FixedLengthBuilder를 반환합니다. 고정 길이 필드는 특정 위치에서 고정된 길이로 값을 추출합니다.
  • targetType(Class<? extends T> targetType

    • 읽은 데이터를 매핑할 도메인 객체의 타입을 설정합니다. 제네릭 타입으로 지정된 타입을 사용합니다.
  • prototypeBeanName(String prototypeBeanName)

    • 프로토타입 빈의 이름을 설정합니다. 프로토타입 빈은 매번 생성되는 빈으로, 상태를 공유하지 않습니다.
  • beanFactory(BeanFactory beanFactory)

    • BeanFactory를 설정합니다. FlatFileItemReader가 빈을 생성할 때 사용됩니다.
  • customEditors(Map<Class<?>, PropertyEditor> customEditors)

    • 사용자 정의 PropertyEditor를 설정합니다. 특정 타입의 프로퍼티에 대한 변환을 사용자가 정의한 PropertyEditor로 수행할 수 있습니다.
  • distanceLimit(int distanceLimit)

    • 거리 제한(distance limit)을 설정합니다. 거리 제한은 필드 추출 시 최대 길이를 제한하는 데 사용됩니다.
  • beanMapperStrict(boolean beanMapperStrict)

    • BeanMapper의 엄격 모드를 설정합니다. 엄격 모드에서는 필드 매핑 오류가 발생하면 예외가 발생합니다.
  • public FlatFileItemReader<T> build()

    • 설정된 값들을 기반으로 FlatFileItemReader를 생성합니다.
  • private void updateTokenizerValidation(Object tokenizer, int index)

    • 토큰화기(Tokenizer)의 유효성을 업데이트하는 내부 메소드입니다. 일반적으로 사용자는 이 메소드를 직접 호출할 필요는 없습니다.

JdbcCursorItemReader

JdbcCursorItemReader는 Spring Batch 프레임워크에서 제공하는 ItemReader의 구현체 중 하나로, JDBC를 사용하여 데이터베이스에서 데이터를 읽어오기 위해 사용됩니다.

JdbcCursorItemReader는 SQL 쿼리를 실행하고 결과 집합을 커서(cursor)를 사용하여 가져옵니다. 이 커서는 결과 집합을 한 번에 전체적으로 가져오지 않고, 필요한 부분만 가져올 수 있도록 합니다. 이는 대규모 데이터베이스 작업에서 효율적으로 메모리를 사용할 수 있도록 도와줍니다.

JdbcCursorItemReader는 구성 가능한 SQL 쿼리, 매개 변수 바인딩, 페이징 및 정렬을 지원합니다. 또한, 데이터베이스의 각 레코드를 Java 객체로 변환하여 반환할 수 있으므로, 이를 통해 다른 스프링 배치 구성 요소에서 사용할 수 있는 유용한 데이터 모델을 만들 수 있습니다.

JdbcCursorItemReaderBuilder

  • saveState(boolean saveState)
    • JdbcCursorItemReader의 상태를 저장할지 여부를 설정합니다. true로 설정하면 상태가 저장되어 재시작 시 이전 상태로 복구됩니다.
  • name(String name)
    • JdbcCursorItemReader의 이름을 설정합니다. 이 이름은 스텝 구성에서 사용될 수 있습니다.
  • maxItemCount(int maxItemCount)
    • 최대 읽기 아이템 수를 설정합니다. 이 값을 설정하면 지정된 수만큼 아이템을 읽은 후 리더가 끝납니다.
  • currentItemCount(int currentItemCount)
    • 현재 읽은 아이템 수를 설정합니다. 이 값을 설정하면 리더가 재시작될 때 이전 상태로 복구됩니다.
  • dataSource(DataSource dataSource)
    • 사용할 데이터 소스(DataSource)를 설정합니다. JDBC 연결을 수행할 때 사용됩니다.
  • fetchSize(int fetchSize)
    • 한 번에 가져올 레코드 수(fetch size)를 설정합니다. 큰 데이터셋을 처리할 때 성능을 향상시키는 데 도움이 됩니다.
  • maxRows(int maxRows)
    • 최대 반환되는 행 수를 제한합니다.
  • queryTimeout(int queryTimeout)
    • 쿼리 실행 시 타임아웃 시간을 설정합니다.
  • ignoreWarnings(boolean ignoreWarnings)
    • 경고(warning)를 무시할지 여부를 설정합니다.
  • verifyCursorPosition(boolean verifyCursorPosition)
    • 커서 위치를 확인할지 여부를 설정합니다. 커서 위치 확인은 읽기 진행 중 커서가 정상적인 위치에 있는지 확인하는 작업입니다.
  • driverSupportsAbsolute(boolean driverSupportsAbsolute)
    • 드라이버가 절대 커서 위치를 지원하는지 여부를 설정합니다.
  • useSharedExtendedConnection(boolean useSharedExtendedConnection)
    • 공유 확장 연결(shared extended connection)을 사용할지 여부를 설정합니다.
  • preparedStatementSetter(PreparedStatementSetter preparedStatementSetter)
    • PreparedStatementSetter를 설정하여 SQL 문에 인수를 바인딩합니다.
  • queryArguments(Object... args)
    • SQL 쿼리의 인수를 설정합니다. 가변 인수로 전달되며, 쿼리에 매핑되는 순서대로 인수를 제공합니다.
  • queryArguments(Object[] args, int[] types)
    • SQL 쿼리의 인수와 해당 인수의 JDBC 타입을 설정합니다.
  • queryArguments(List<?> args)
    • SQL 쿼리의 인수를 설정합니다. List 형태로 인수를 전달합니다.
  • sql(String sql)
    • 실행할 SQL 문을 설정합니다.
  • rowMapper(RowMapper<T> rowMapper)
    • RowMapper를 설정하여 ResultSet의 행을 도메인 객체로 매핑합니다.
  • beanRowMapper(Class<T> mappedClass)
    • BeanRowMapper를 설정하여 ResultSet의 행을 지정된 도메인 객체 타입으로 매핑합니다.

JpaPagingItemReader

JpaPagingItemReader는 Spring Batch 프레임워크에서 제공하는 ItemReader의 구현체 중 하나로, JPA(Java Persistence API)를 사용하여 데이터베이스에서 페이지별로 데이터를 읽어오기 위해 사용됩니다.

JpaPagingItemReader는 Spring Data JPA를 기반으로 구현되어 있으며, 페이징 및 정렬을 지원합니다. 이는 대규모 데이터베이스 작업에서 효율적으로 메모리를 사용할 수 있도록 도와줍니다.

JpaPagingItemReader는 구성 가능한 JPA 쿼리, 매개 변수 바인딩, 페이징 및 정렬을 지원합니다. 또한, 데이터베이스의 각 레코드를 Java 객체로 변환하여 반환할 수 있으므로, 이를 통해 다른 스프링 배치 구성 요소에서 사용할 수 있는 유용한 데이터 모델을 만들 수 있습니다.

JpaPagingItemReaderBuilder

  • saveState(boolean saveState)

    • JpaPagingItemReader의 상태를 저장할지 여부를 설정합니다. true로 설정하면 상태가 저장되어 재시작 시 이전 상태로 복구됩니다.
  • name(String name)

    • JpaPagingItemReader의 이름을 설정합니다. 이 이름은 스텝 구성에서 사용될 수 있습니다.
  • maxItemCount(int maxItemCount)

    • 최대 읽기 아이템 수를 설정합니다. 이 값을 설정하면 지정된 수만큼 아이템을 읽은 후 리더가 끝납니다.
  • currentItemCount(int currentItemCount)

    • 현재 읽은 아이템 수를 설정합니다. 이 값을 설정하면 리더가 재시작될 때 이전 상태로 복구됩니다.
  • pageSize(int pageSize)

    • 한 페이지에서 읽을 아이템 수를 설정합니다. 페이지마다 일괄 처리될 아이템 수를 제어하는 데 사용됩니다.
  • parameterValues(Map<String, Object> parameterValues)

    • JPA 쿼리의 매개변수 값을 설정합니다. 매개변수 이름과 값을 매핑하는 맵을 전달합니다.
  • queryProvider(JpaQueryProvider queryProvider)

    • JpaQueryProvider를 설정하여 JPA 쿼리를 제공합니다. JpaQueryProvider는 데이터베이스와 관련된 쿼리를 생성하는 인터페이스입니다.
  • queryString(String queryString)

    • 직접 쿼리 문자열을 설정합니다. JPA 쿼리를 직접 지정하고자 할 때 사용됩니다.
  • transacted(boolean transacted)

    • 트랜잭션 처리 여부를 설정합니다. true로 설정하면 리더는 트랜잭션 내에서 실행됩니다.
  • entityManagerFactory(EntityManagerFactory entityManagerFactory)

    • 사용할 EntityManagerFactory를 설정합니다. JPA 연결을 수행할 때 사용됩니다.
  • build()

    • 설정된 값들을 기반으로 JpaPagingItemReader를 생성합니다.

StaxEventItemReader

StaxEventItemReader는 Spring Batch 프레임워크에서 제공하는 ItemReader의 구현체 중 하나로, XML 문서에서 데이터를 읽어오기 위해 사용됩니다.

StaxEventItemReader는 XML을 파싱하는 데에 StAX(Streaming API for XML)를 사용합니다. 이를 통해 대용량 XML 파일을 효율적으로 처리할 수 있으며, 메모리 사용량을 줄일 수 있습니다.

StaxEventItemReader는 구성 가능한 XML 스키마, 태그 이름 및 XPath를 지원합니다. 또한, XML의 각 노드를 Java 객체로 변환하여 반환할 수 있으므로, 이를 통해 다른 스프링 배치 구성 요소에서 사용할 수 있는 유용한 데이터 모델을 만들 수 있습니다.

StaxEventItemReaderBuilder

  • saveState(boolean saveState)

    • StaxEventItemReader의 상태를 저장할지 여부를 설정합니다. true로 설정하면 상태가 저장되어 재시작 시 이전 상태로 복구됩니다.
  • name(String name)

    • StaxEventItemReader의 이름을 설정합니다. 이 이름은 스텝 구성에서 사용될 수 있습니다.
  • maxItemCount(int maxItemCount)

    • 최대 읽기 아이템 수를 설정합니다. 이 값을 설정하면 지정된 수만큼 아이템을 읽은 후 리더가 끝납니다.
  • currentItemCount(int currentItemCount)

    • 현재 읽은 아이템 수를 설정합니다. 이 값을 설정하면 리더가 재시작될 때 이전 상태로 복구됩니다.
  • resource(Resource resource)

    • 읽을 XML 리소스(Resource)를 설정합니다.
  • unmarshaller(Unmarshaller unmarshaller)

    • Unmarshaller를 설정하여 XML을 도메인 객체로 언마샬링합니다.
  • addFragmentRootElements(String... fragmentRootElements)

    • 파편(fragment)의 루트 엘리먼트를 추가합니다. 지정된 엘리먼트 이름의 하위 요소를 아이템으로 처리합니다.
  • addFragmentRootElements(List<String> fragmentRootElements)

    • 파편(fragment)의 루트 엘리먼트를 추가합니다. 지정된 엘리먼트 이름의 하위 요소를 아이템으로 처리합니다. List 형태로 엘리먼트 이름을 전달합니다.
  • strict(boolean strict)

    • 엄격 모드(strict mode)를 설정합니다. 엄격 모드에서는 XML 구조에 대한 검증이 수행되며, 오류가 발생하면 예외가 발생합니다.
  • xmlInputFactory(XMLInputFactory xmlInpzutFactory)

    • 사용할 XMLInputFactory를 설정합니다. StAX 이벤트 리더를 생성하는 데 사용됩니다.
  • encoding(String encoding)

    • XML 인코딩을 설정합니다. 읽을 XML의 인코딩을 지정할 수 있습니다.
  • build()

    • 설정된 값들을 기반으로 StaxEventItemReader를 생성합니다.

JmsItemReader

JmsItemReaderBuilder 에 의해 생성되는 ItemReader의 구현체 중 하나

JMS(Java Message Service)를 사용하여 메시지 큐에서 데이터를 읽어오기 위해 사용됩니다.

JmsItemReader는 구성 가능한 JMS 목적지(destination), 메시지 선택자(selector), 메시지 수신 타임아웃(timeout) 등을 지원합니다. 이를 통해 메시지 큐에서 필요한 데이터를 선택적으로 읽어오거나, 메시지 큐에서 일정 시간 이내에 수신되지 않은 메시지를 자동으로 처리할 수 있습니다.

JmsItemReader는 메시지를 Java 객체로 변환하여 반환할 수 있으므로, 이를 통해 다른 스프링 배치 구성 요소에서 사용할 수 있는 유용한 데이터 모델을 만들 수 있습니다.

JmsItemReaderBuilder

  • jmsTemplate(JmsOperations jmsTemplate)

    • 사용할 JmsOperations (일반적으로 JmsTemplate)를 설정합니다. JmsOperations는 JMS 메시지를 송수신하는 데 사용되는 인터페이스입니다. JmsItemReader는 이 JmsOperations를 사용하여 메시지를 읽어옵니다.
  • itemType(Class<? extends T> itemType)

    • 읽어올 JMS 메시지를 매핑할 도메인 객체의 클래스를 설정합니다. itemType으로 지정된 클래스에 대한 매핑이 수행됩니다.
  • build()

    • 설정된 값들을 기반으로 JmsItemReader를 생성합니다.

JdbcPagingItemReader

JdbcPagingItemReaderBuilder 에 의해 생성되는 ItemReader의 구현체

JdbcPagingItemReader는 JDBC를 사용하여 페이징 방식으로 데이터를 읽어오는 Spring Batch의 리더입니다. 주로 관계형 데이터베이스에서 대량의 데이터를 페이징 처리하여 처리할 때 사용됩니다.

JdbcPagingItemReader는 페이지마다 일괄 처리될 아이템 수를 지정하여 데이터를 효율적으로 처리할 수 있습니다. 각 페이지에서는 지정된 수의 아이템을 데이터베이스로부터 조회하여 처리하며, 페이지마다 커서를 이동시키면서 데이터를 읽어옵니다.

JdbcPagingItemReader는 다음과 같은 핵심 구성 요소를 가지고 있습니다:

  1. DataSource: 데이터베이스 연결 정보를 제공하는 객체로, JdbcPagingItemReader가 데이터베이스에 접근할 때 사용됩니다.
  2. PagingQueryProvider: 페이지별로 실행할 SQL 쿼리를 동적으로 생성하는 역할을 합니다. 데이터베이스의 유형에 따라 적절한 QueryProvider를 선택하여 사용할 수 있습니다.
  3. RowMapper: JdbcPagingItemReader가 조회한 각 행을 도메인 객체로 매핑하는 역할을 합니다. RowMapper는 Spring의 RowMapper 인터페이스를 구현하여 작성하며, 매핑 로직을 정의합니다.

JdbcPagingItemReader를 구성할 때는 다음과 같은 단계를 따릅니다:

  1. DataSource 설정: JdbcPagingItemReader의 데이터베이스 연결 정보를 설정합니다. Spring의 DataSource 인터페이스를 구현한 객체를 제공해야 합니다.
  2. PagingQueryProvider 설정: 데이터베이스 유형에 따라 적절한 PagingQueryProvider를 선택하고 설정합니다. 이 QueryProvider는 페이지별로 실행될 SQL 쿼리를 동적으로 생성합니다. 대표적으로 JdbcPagingItemReader에서는 SqlPagingQueryProviderFactoryBean을 사용하여 QueryProvider를 설정합니다.
  3. RowMapper 설정: 조회한 각 행을 매핑할 RowMapper를 구현하고 설정합니다. 각 행을 도메인 객체로 변환하는 매핑 로직을 정의합니다.
  4. 기타 설정: fetchSize, pageSize, parameterValues 등 JdbcPagingItemReader의 동작에 영향을 주는 추가 설정을 수행합니다.
  5. JdbcPagingItemReader 생성: 위에서 구성한 값들을 사용하여 JdbcPagingItemReader 객체를 생성합니다.

JdbcPagingItemReader는 Spring Batch의 스텝 구성에서 리더로 사용되며, 청크 단위로 데이터를 읽어옵니다. 각 청크에서는 JdbcPagingItemReader가 페이지별로 지정된 수의 아이템을 데이터베이스에서 조회하여 처리합니다.

JdbcPagingItemReaderBuilder

  • saveState(boolean saveState)

    • JdbcPagingItemReader의 상태를 저장할지 여부를 설정합니다. true로 설정하면 상태가 저장되어 재시작 시 이전 상태로 복구됩니다.
  • name(String name)

    • JdbcPagingItemReader의 이름을 설정합니다. 이 이름은 스텝 구성에서 사용될 수 있습니다.
  • maxItemCount(int maxItemCount)

    • 최대 읽기 아이템 수를 설정합니다. 이 값을 설정하면 지정된 수만큼 아이템을 읽은 후 리더가 끝납니다.
  • currentItemCount(int currentItemCount)

    • 현재 읽은 아이템 수를 설정합니다. 이 값을 설정하면 리더가 재시작될 때 이전 상태로 복구됩니다.
  • dataSource(DataSource dataSource)

    • 사용할 DataSource를 설정합니다. JdbcPagingItemReader는 데이터베이스 연결을 수행할 때 이 DataSource를 사용합니다.
  • fetchSize(int fetchSize)

    • 데이터베이스로부터 한 번에 가져올 행의 수를 설정합니다.
  • rowMapper(RowMapper<T> rowMapper)

    • 각 행을 도메인 객체로 매핑하는 RowMapper를 설정합니다.
  • beanRowMapper(Class<T> mappedClass)

    • 도메인 객체의 클래스를 기반으로 BeanPropertyRowMapper를 생성하여 RowMapper로 설정합니다.
  • parameterValues(Map<String, Object> parameterValues)

    • SQL 쿼리의 매개변수 값을 설정합니다. 매개변수 이름과 값을 매핑하는 맵을 전달합니다.
  • pageSize(int pageSize)

    • 한 페이지에서 읽을 아이템 수를 설정합니다. 페이지마다 일괄 처리될 아이템 수를 제어하는 데 사용됩니다.
  • groupClause(String groupClause)

    • SQL 쿼리의 GROUP BY 절을 설정합니다.
  • selectClause(String selectClause)

    • SQL 쿼리의 SELECT 절을 설정합니다.
  • fromClause(String fromClause)

    • SQL 쿼리의 FROM 절을 설정합니다.
  • whereClause(String whereClause)

    • SQL 쿼리의 WHERE 절을 설정합니다.
  • sortKeys(Map<String, Order> sortKeys)

    • SQL 쿼리의 정렬 키를 설정합니다. 맵으로 정렬 키와 정렬 방식(Order)을 지정합니다.
  • queryProvider(PagingQueryProvider provider)

    • PagingQueryProvider를 설정하여 SQL 쿼리를 제공합니다. JdbcPagingItemReader는 페이징 쿼리를 동적으로 생성하기 위해 이 QueryProvider를 사용합니다.
  • build()

    • 설정된 값들을 기반으로 JdbcPagingItemReader를 생성합니다.
  • private PagingQueryProvider determineQueryProvider(DataSource dataSource)

    • DataSource를 기반으로 PagingQueryProvider를 결정합니다. 데이터베이스 유형에 따라 적합한 QueryProvider를 선택하여 반환합니다.
Share