23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요
이번에는 Spring Batch의 Chunk Model과 Tasklet Model에 대해서 알아볼 것입니다.
Chunk Model은 처리할 데이터를 일정단위(청크) 로 처리하는 방식이다.
ChunkOrientedTasklet 은 청크 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 수행한다.
청크에 포함될 데이터의 최대 레코드 수(청크 Size), 는 본 클래스의 commit-interval이라는 설정값을 이용하여 조정이 가능하다.
ItemReader, ItemProcessor, ItemWriter 는 청크 단위를 처리하기 위한 인터페이스이다.
위 시퀀스 다이어그램과 같이 ChunkOrientedTasklet 은 ItemReader, ItemProcessor, ItemWriter 구현체를 각각 호출한다.
이때 ChunkOrientedTasklet 은 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 를 반복실행한다.
청크 크기만큼 ItemReader가 데이터를 읽어 들인다.
청크 단위를 ItemProcessor로 전달하고, 데이터를 처리한다.
ItemProcessor를 처리하고난 청크 단위가 ItemWriter로 전달되어 데이터를 저장하거나, 파일처리를 수행한다.
ItemProcessor은 구체적인 구현체를 구현하여 스프링배치에 전달한다.
ItemProcessor은 Reader로 읽어들인 청크 데이터들을 처리한다. 처리라고 하면, 데이터를 변환하거나, 데이터에 변경 혹은 외부 인터페이스 호출등을 수행하는 역할을 한다.
ItemProcessor은 chunk model에서 없어도 되는 옵션이다.
public class MyItemProcessor implements
ItemProcessor<MyInputObject, MyOutputObject> { // (1)
@Override
public MyOutputObject process(MyInputObject item) throws Exception { // (2)
MyOutputObject processedObject = new MyOutputObject(); // (3)
// Coding business logic for item of input data
return processedObject; // (4)
}
}(1): ItemProcessor 인터페이스를 구현하게 된다. 이때 입력, 출력 데이터 타입을 제네릭 타입으로 받는다.
(2): process메소드 구현체를 구현하며, 입력 아규먼트로 받아 들인다.
(3): ItemProcessor 처리 결과로 반환할 출력 객체를 생성한다. 즉, 변환된 데이터 등이 올 수 있다.
(4): 출력 객체를 반환한다.
ItemReader는 직접 커스텀 구현을 할 수 있지만 스프링배치에서는 이미 구현된 다양한 ItemReader구현체를 제공한다.
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에서 읽어들인다.
ItemReader와 마찬가지로 Spring Batch에는 다양한 ItemProcessor 구현체도 제공한다.
PassThroughItemProcessor:
아무 작업도 수행하지 않는다.
입력된 데이터의 변경이나 처리가 필요하지 않는경우 사용된다.
ValidatingItemProcessor:
입력된 데이터를 체크한다.
입력 확인 규칙을 구현하려면 Spring Batch 전용 org.springframework.batch.item.validator.Validator를 구현해야한다.
그러나 일반적인 org.springframework.validation.Validator 의 어댑터인 SpringValidator와 org.springframework.validation의 규칙을 제공한다.
CompositeItemProcessor:
동일한 입력 데이터에 대해 여러 ItemProcessor를 순차적으로 실행한다.
ValidatingItemProcessor를 사용하여 입력 확인을 수행한 후 비즈니스 로직을 실행하려는 경우 활성화 된다.
역시 ItemWriter의 다양한 구현체를 제공한다.
FlatFileItemWriter:
처리된 Java객체를 CSV 파일과 같은 플랫 파일로 작성한다.
파일 라인에 대한 매핑 규칙은 구분 기호 및 개체에서 사용자 정의로 사용할수도 있다.
StaxEventItemWriter:
XML파일로 자바 객체를 쓰기할 수 있다.
JdbcBatchItemWriter:
JDBC를 사용하여 SQL을 수행하고 자바 객체를 데이터베이스에 쓰기한다.
내부적으로 JdbcTemplate를 사용하게 된다.
MyBatisBatchItemWriter:
Mybatis를 사용하여 자바 객체를 데이터베이스로 쓰기한다.
MyBatis-Spring 는 MyBatis에 의해서 제공되는 라이브러리를 이용한다.
JmsItemWriter / AmqpItemWriter:
JMS혹은 AMQP로 자바 객체의 메시지를 전송한다.
chunk model은 큰 데이터를 분할해서 ItemReader --> ItemProcessor --> ItemWriter 순으로 처리가 필요한경우 매우 유용하다.
반면 청크 단위의 처리가 딱 맞지 않을경우 Tasklet Model이 유용하다.
예를들어 한번에 하나의 레코드만 읽어서 쓰기해야하는 경우 Tasklet Model이 적합하다.
사용자는 Tasklet 모델을 사용하면서 Spring Batch에서 제공하는 Tasklet 인터페이스를 구현해야한다.
SystemCommandTasklet:
시스템 명령어를 비동기적으로 실행하는 Tasklet이다.
명령 속성에 수행해야할 명령어를 지정하여 사용할 수 있다.
시스템 명령은 호출하는 스레드와 다른 스레드에 의해 실행되므로 프로세스 도중 타임아웃을 설정하고, 시스템 명령의 실행 스레드를 취소할 수 있다.
MethodInvokingTaskletAdapter:
POJO클래스의 특정 메소드를 실행하기 위한 태스클릿이다.
targetObject 속성에 대상 클래스의 빈을 지정하고, targetMethod속성에 실행할 메소드 이름을 지정한다.
POJO 클래스는 일괄 처리 종료 상태를 메소드의 반환 값으로 반환이 가능하지만, 이경우 사실은 ExitStatus를 반환값으로 설정해야한다.
다른 타입의 값이 반환될 경우 반환값과 상관없이 "정상 종료(ExitStatus:COMPLETED)" 상태로 간주된다.
Chunk Model은 큰 데[이터를 부분(청크)로 쪼개어 조금씩 처리하는 방식이다.
처리해야할 데이터가 많은경우 Chunk Model을 사용하여 분할로 전체를 처리하면 메모리도 적게 사용하고, 안정적으로 배치를 수행할 수 있다.
Tasklet Model은 작은 데이터를 한번에 처리하거나, 한번의 태스크로 배치를 수행해야하는 경우 이용하는 방식이다.
처리해야할 데이터가 작은경우 Tasklet Model을 이용하면 쉬운 방법으로 배치를 개발할 수 있다.
Chunk나 Tasklet은 처리해야할 데이터의 양, 처리 방식에 따라 선택할 필요가 있다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.