-
3.SpringBatch ChunkModel과 TaskletModelSpring/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)" 상태로 간주된다.
'Spring > Spring Batch' 카테고리의 다른 글
7. MyBatisPagingItemReader로 DB내용을 읽고, MyBatisItemWriter로 DB에 쓰기 (2) 2024.11.18 5. JdbcPagingItemReader로 DB내용을 읽고, JdbcBatchItemWriter로 DB에 쓰기 (0) 2024.11.05 4. FlatFileItemReader로 단순 파일 읽고, FlatFileItemWriter로 파일에 쓰기 (0) 2024.11.04 2.SpringBatch 코드 설명 및 아키텍처 알아보기 (0) 2024.10.20 1.SpringBatch 빠르게 시작하기 (3) 2024.10.20