ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 배치 Processor의 Filtering
    개발/Spring 2021. 12. 27. 02:31

    스프링 배치의 필터링 

    최근 아래와 같은 물음을 받은 적이 있다.

    스프링 배치에서 만약 10000건을 읽어왔을 때,

    업데이트 대상은 100건 정도임에도 불구하고 10000건의 업데이트를 치게되냐? 

     

    내 대답 : 100건에 대한 업데이트만 발생한다.

    왜냐하면 스프링배치의 Processor가 null을 리턴하면 해당 item은 writer 로 가지 않는다.

     

    라고 말했었다.

     

    사실 내 눈으로 확인한 적이 없었다.

    그래서 말하고도 약간 자신이 없었다.

     

    분명히 그렇게 알고는 있는데.. 코드로 확인한 적이 없어 찜찜했다.

    다음부턴 확실하게 알고 얘기할 수 있도록 한번 내부동작을 간단히 살펴보았다.

     

    시작!

    step이 시작되면 아래와 같이 진행된다.

     

     

    ChunkOrientedTasklet

    chunkProcessor.process() 로 진입하면서 chunk 단위의 process 및 write 작업이 시작된다.

    (아래에서 두번째 줄 코드)

     

     

    SimpleChunkProcessor

    위에서 진입했던 chunkProcessor의 process() 메서드이다.

    inputs는 reader를 통해 chunkSize 만큼 읽어온 객체들이다.

    transform() 메서드에 이 inputs들을 넘겨주며 본격적으로 process 를 시작한다.

     

    transform() 메서드다.

    inputs 를 순회하면서 doProcess() 를 실행한 후 output에 저장한다. (319라인)

    333 라인을 보면 output이 null이 아닌 경우 outputs 라는 리스트에 결과를 저장한다.

    337 라인을 보면 output이 null인 경우 반복자(iterator)를 제거하는 것을 확인할 수 있다!

     

     

     

    지금까지 흐름을 정리해보자면

    • reader를 통해 읽어온 데이터들을 Chunk 단위로 처리를 하게 된다.
      (ChunkSize가 100이라면 Chunk에는 100개의 아이템이 들어있는 것이다.)
    • Chunk 에 들어있는 아이템들을 하나씩 순회하면서 processor가 개발자가 정의한 작업을 처리하게 된다.
    • processor의 처리 결과가 not null인 아이템만 outputs 를 담아서 최종적으로 리턴한다!
      (반대로 null인 item들은 Chunk 리스트에서 된다)

     

     

     

    다시 transform()이 끝나고 process() 메서드로 돌아왔다.

    210 라인의 outputs는 processor의 결과가 null인 아이템들은 제외된 Chunk가 된다.

    그리고 217 라인에서 write() 가 발생하고, outputs 를 넘겨준다.

     

    이렇게해서 Processor는 null을 리턴하면 writer로 넘겨주지 않는 다는 것을 확인하였다.

     

     

     

    스프링 배치는 저번에 어쩌다가 사용하게 된 도구고, 사실 깊게 알고싶은 마음은 없었다.

    그런데 조금 들여다보기 시작하니 재밌기도 하고, 배치에서 청크나 트랜잭션이 중요한 개념이다 보니 (맞나?), 

    공부해두면 실력 향상에 많은 도움이 될 것 같기도 하다.

     

    아주 시간을 쏟진 않고, 틈틈히 봐야겠다.

    댓글

Designed by Tistory.