ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3.SpringBatch ChunkModel과 TaskletModel
    Spring/Spring Batch 2024. 10. 21. 01:36

    SpringBatch에서 데이터 처리 단위인 ChuckModel과 TaskletModel의 차이점에 대해 알아보고자 한다.

     

     

    1. Chunk Model

      • Chunk Model은 처리할 데이터를 일정단위(청크) 로 처리하는 방식이다
      • ChunkOrientedTaskLet은 Spring Batch에서 제공하는 TaskLet 인터페이스의 구현체
      • Chunk size 만큼 ItemReader, ItemProcessor, ItemWrite 처리하며, commit-interval이라는 설정값을 이용하여 조정이 가능
      • Chunk는 최대 Size만큼의 크기를 가진다. 예를 들어 20개의 소스를 처리해야하고, Chunk Size가 2인 경우 Chunk는 2개씩 처리되기 때문에 총 10번의 반복이 필요하다. 즉 10번의 트랜잭션을 탄다는 소리로 이해를 할 수 있다.
      • 몇번의 트랙잭션을 수행 할 것인지도 Chunk Size를 통해 조정이 가능하다.

    Chunk 단위의 트랜잭션 처리

    • 각 Chunk가 읽기(Read), 처리(Process), 쓰기(Write) 작업을 거치고 성공적으로 끝나면, 그 Chunk는 트랜잭션이 커밋한다.
    • 예를 들어, 첫 번째 Chunk가 성공하면 트랜잭션이 커밋되고, 두 번째 Chunk가 실행된다.
    • 만약 두 번째 Chunk가 처리되는 도중에 예외(Exception)가 발생하면, 그 Chunk만 롤백한다.
    • 하지만 첫 번째 Chunk는 이미 성공적으로 커밋되었으므로 롤백되지 않습니다. 이는 각 Chunk가 별도의 트랜잭션으로 처리한다.
    • Spring Batch는 데이터 처리의 안정성을 높이기 위해 Chunk 단위로 트랜잭션을 분리합니다. 이렇게 하면 대용량 데이터를 처리할 때, 부분적으로 성공한 Chunk는 다시 처리하지 않아도 되므로 성능을 향상시킬 수 있다.
    • 따라서, 이전 Chunk가 성공적으로 커밋되었고, 다음 Chunk에서 실패가 발생해도 이전 Chunk는 롤백되지 않는다. 이는 Chunk 단위로 트랜잭션을 관리하는 Spring Batch의 동작 방식 때문이다.

    • ChunkOrientedTasklet 은 ItemReader, ItemProcessor, ItemWriter 구현체를 각각 호출
    • Chunk 단위  만큼 ItemReader, ItemProcessor, ItemWriter 구현체를 반복 실행

    2. ItemReader

    스프링배치에서는 이미 구현된 다양한 ItemReader구현체를 제공

    Chunk 단위  만큼 데이터를 읽고 다음 ItemProcessor와 ItemWriter에게 전달한다.

     

    • FlatFileItemReader:
      • 플랫파일 (즉 구조화 되지 않은파일을 플랫파일이라고한다.)을 읽어 들인다.
      • 대표적인 것이 CSV파일 등이 있다.
      • 읽어들인 데이터를 객체로 매핑하기 위해서 delimeter를 기준으로 매핑 룰을 이용하여 객체로 매핑한다.
      • 혹은 입력에 대해서 Resource object를 이용하여 커스텀하게 매핑할 수도 있다.
    • StaxEventItemReader:
      • XML파일을 읽어 들인다.
      • 이름이 함축하듯이 XML파일을 StAX기반으로 읽어 들인다.
    • JdbcPagingItemReader / JdbcCursorItemReader:
      • JDBC를 사용하여 SQL을 실행하고 데이터베이스의 레코드를 읽는다.
      • 데이터베이스에서 많은 양의 데이터를 처리해야 하는 경우에는 메모리에 있는 모든 레코드를 읽는 것을 피하고, 한 번의 처리에 필요한 데이터만 읽고 폐기하는 것이 필요하다.
      • JdbcPagingItemReader는 JdbcTemplate을 이용하여 각 페이지에 대한 SELECT SQL을 나누어 처리하는 방식으로 구현된다.
      • 반면 JdbcCursorItemReader는 JDBC 커서를 이용하여 하나의 SELECT SQL을 발행하여 구현된다.
    • MyBatisCursorItemReader / MyBatisPagingItemReader:
      • MyBatis를 사용하여 데이터베이스의 레코드를 읽는다.
      • MyBatis가 제공하는 Spring 조정 라이브러리는 MyBatis-Spring에서 제공된다.
      • Paging과 Cursor의 차이점은 MyBatis를 구현방법이 다를뿐이지 JdbcXXXItemReader과 동일하다
      • 또한 ItemReaderJPA구현이나 Hibernate와 연동하여 데이터베이스의 레코드를 읽어오는 JpaPagingItemReader, HibernatePagingItemReader, HibernateCursor를 제공한다.
    • JmsItemReader / AmqpItemReader:
      • 메시지를 JMS혹은 AMQP에서 읽어들인다

    3. ItemProcessor

    ItemProcessor는 ItemReader를 통해 읽어온 데이터를 처리 및 가공하는 역할을 한다. 

    • PassThroughItemProcessor:
      • 아무 작업도 수행하지 않는다.
      • 입력된 데이터의 변경이나 처리가 필요하지 않는경우 사용된다.
    • ValidatingItemProcessor:
      • 입력된 데이터를 체크한다.
      • 입력 확인 규칙을 구현하려면 Spring Batch 전용 org.springframework.batch.item.validator.Validator를 구현해야한다.
      • 그러나 일반적인 org.springframework.validation.Validator 의 어댑터인 SpringValidator와 org.springframework.validation의 규칙을 제공한다.
    • CompositeItemProcessor:
      • 동일한 입력 데이터에 대해 여러 ItemProcessor를 순차적으로 실행한다.
      • ValidatingItemProcessor를 사용하여 입력 확인을 수행한 후 비즈니스 로직을 실행하려는 경우 활성화 된다.

    4. ItemWriter

    ItemWriter는 ItemProcessor가 처리 한 데이터를 파일 및 DB에 저장하는 역할을 한다.

    • FlatFileItemWriter:
      • 처리된 Java객체를 CSV 파일과 같은 플랫 파일로 작성한다.
      • 파일 라인에 대한 매핑 규칙은 구분 기호 및 개체에서 사용자 정의로 사용할수도 있다.
    • StaxEventItemWriter:
      • XML파일로 자바 객체를 쓰기할 수 있다.
    • JdbcBatchItemWriter:
      • JDBC를 사용하여 SQL을 수행하고 자바 객체를 데이터베이스에 쓰기한다.
      • 내부적으로 JdbcTemplate를 사용하게 된다.
    • MyBatisBatchItemWriter:
      • Mybatis를 사용하여 자바 객체를 데이터베이스로 쓰기한다.
      • MyBatis-Spring 는 MyBatis에 의해서 제공되는 라이브러리를 이용한다.
    • JmsItemWriter / AmqpItemWriter:
      • JMS혹은 AMQP로 자바 객체의 메시지를 전송한다.

    5. Tasklet Model

    Chunk 단위로 데이터를 나눠서 처리하는 것이 아닌 한번에 하나의 레코드만 읽어서 처리 할 경우 Tasklet Model이 적합하다

    앞선, 2장에서 GreetingTask를 구현 한 것과 같이 사용자가 직접 인터페이스 구현을 해야한다.

     

    • SystemCommandTasklet:
      • 시스템 명령어를 비동기적으로 실행하는 Tasklet이다.
      • 명령 속성에 수행해야할 명령어를 지정하여 사용할 수 있다.
      • 시스템 명령은 호출하는 스레드와 다른 스레드에 의해 실행되므로 프로세스 도중 타임아웃을 설정하고, 시스템 명령의 실행 스레드를 취소할 수 있다.
    • MethodInvokingTaskletAdapter:
      • POJO클래스의 특정 메소드를 실행하기 위한 태스클릿이다.
      • targetObject 속성에 대상 클래스의 빈을 지정하고, targetMethod속성에 실행할 메소드 이름을 지정한다.
      • POJO 클래스는 일괄 처리 종료 상태를 메소드의 반환 값으로 반환이 가능하지만, 이경우 사실은 ExitStatus를 반환값으로 설정해야한다.
      • 다른 타입의 값이 반환될 경우 반환값과 상관없이 "정상 종료(ExitStatus:COMPLETED)" 상태로 간주된다.

    댓글

Designed by Tistory.