데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel

      KIDO 24.09.25
      3,011 7 4
      DEVOTEE 요약
      Spring Batch의 Chunk Model은 데이터를 작은 단위로 나눠 반복적으로 처리하는 방식이며, 청크 크기만큼 데이터를 읽고(ItemReader), 처리한 후(ItemProcessor), 결과를 저장하거나 파일처리(ItemWriter) 한다. Tasklet Model은 데이터를 하나씩 처리하거나 한 번의 태스크로 배치를 수행할 때 이용되며, 한 레코드씩 읽어 써야 하는 경우 적합하다. Chunk 모델은 대량 데이터를 안정적으로 처리하는 데 유리하며, Tasklet 모델은 작은 데이터를 간편하게 처리하는 데 적합하다.
      DEVOTEE 추천 블로그

      안녕하세요

      이번에는 Spring Batch의 Chunk Model과 Tasklet Model에 대해서 알아볼 것입니다.


      Chunk Model 알아보기

      • Chunk Model은 처리할 데이터를 일정단위(청크) 로 처리하는 방식이다.

      • ChunkOrientedTasklet 은 청크 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 수행한다.

      • 청크에 포함될 데이터의 최대 레코드 수(청크 Size), 는 본 클래스의 commit-interval이라는 설정값을 이용하여 조정이 가능하다.

      • ItemReader, ItemProcessor, ItemWriter 는 청크 단위를 처리하기 위한 인터페이스이다.

      Chunk Model

      • 위 시퀀스 다이어그램과 같이 ChunkOrientedTasklet 은 ItemReader, ItemProcessor, ItemWriter 구현체를 각각 호출한다.

      • 이때 ChunkOrientedTasklet 은 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 를 반복실행한다.

      • 청크 크기만큼 ItemReader가 데이터를 읽어 들인다.

      • 청크 단위를 ItemProcessor로 전달하고, 데이터를 처리한다.

      • ItemProcessor를 처리하고난 청크 단위가 ItemWriter로 전달되어 데이터를 저장하거나, 파일처리를 수행한다.


      ItemProcessor

      • 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는 직접 커스텀 구현을 할 수 있지만 스프링배치에서는 이미 구현된 다양한 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에서 읽어들인다.


      ItemProcessor

      • 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

      • 역시 ItemWriter의 다양한 구현체를 제공한다.

      제공하는 다양한 구현체

      • FlatFileItemWriter:

        • 처리된 Java객체를 CSV 파일과 같은 플랫 파일로 작성한다.

        • 파일 라인에 대한 매핑 규칙은 구분 기호 및 개체에서 사용자 정의로 사용할수도 있다.

      • StaxEventItemWriter:

        • XML파일로 자바 객체를 쓰기할 수 있다.

      • JdbcBatchItemWriter:

        • JDBC를 사용하여 SQL을 수행하고 자바 객체를 데이터베이스에 쓰기한다.

        • 내부적으로 JdbcTemplate를 사용하게 된다.

      • MyBatisBatchItemWriter:

        • Mybatis를 사용하여 자바 객체를 데이터베이스로 쓰기한다.

        • MyBatis-Spring 는 MyBatis에 의해서 제공되는 라이브러리를 이용한다.

      • JmsItemWriter / AmqpItemWriter:

        • JMS혹은 AMQP로 자바 객체의 메시지를 전송한다.


      Tasklet Model

      • chunk model은 큰 데이터를 분할해서 ItemReader --> ItemProcessor --> ItemWriter 순으로 처리가 필요한경우 매우 유용하다.

      • 반면 청크 단위의 처리가 딱 맞지 않을경우 Tasklet Model이 유용하다.

      • 예를들어 한번에 하나의 레코드만 읽어서 쓰기해야하는 경우 Tasklet Model이 적합하다.

      • 사용자는 Tasklet 모델을 사용하면서 Spring Batch에서 제공하는 Tasklet 인터페이스를 구현해야한다.


      Tasklet 구현클래스

      • SystemCommandTasklet:

        • 시스템 명령어를 비동기적으로 실행하는 Tasklet이다.

        • 명령 속성에 수행해야할 명령어를 지정하여 사용할 수 있다.

        • 시스템 명령은 호출하는 스레드와 다른 스레드에 의해 실행되므로 프로세스 도중 타임아웃을 설정하고, 시스템 명령의 실행 스레드를 취소할 수 있다.

      • MethodInvokingTaskletAdapter:

        • POJO클래스의 특정 메소드를 실행하기 위한 태스클릿이다.

        • targetObject 속성에 대상 클래스의 빈을 지정하고, targetMethod속성에 실행할 메소드 이름을 지정한다.

        • POJO 클래스는 일괄 처리 종료 상태를 메소드의 반환 값으로 반환이 가능하지만, 이경우 사실은 ExitStatus를 반환값으로 설정해야한다.

        • 다른 타입의 값이 반환될 경우 반환값과 상관없이 "정상 종료(ExitStatus:COMPLETED)" 상태로 간주된다.


      WrapUp

      • Chunk Model은 큰 데[이터를 부분(청크)로 쪼개어 조금씩 처리하는 방식이다.

      • 처리해야할 데이터가 많은경우 Chunk Model을 사용하여 분할로 전체를 처리하면 메모리도 적게 사용하고, 안정적으로 배치를 수행할 수 있다.

      • Tasklet Model은 작은 데이터를 한번에 처리하거나, 한번의 태스크로 배치를 수행해야하는 경우 이용하는 방식이다.

      • 처리해야할 데이터가 작은경우 Tasklet Model을 이용하면 쉬운 방법으로 배치를 개발할 수 있다.

      • Chunk나 Tasklet은 처리해야할 데이터의 양, 처리 방식에 따라 선택할 필요가 있다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      KIDO 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기