on
스프링 배치 Processor의 Filtering
스프링 배치 Processor의 Filtering
스프링 배치의 필터링
최근 아래와 같은 물음을 받은 적이 있다.
스프링 배치에서 만약 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개의 아이템이 들어있는 것이다.)
(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로 넘겨주지 않는 다는 것을 확인하였다.
스프링 배치는 저번에 어쩌다가 사용하게 된 도구고, 사실 깊게 알고싶은 마음은 없었다.
그런데 조금 들여다보기 시작하니 재밌기도 하고, 배치에서 청크나 트랜잭션이 중요한 개념이다 보니 (맞나?),
공부해두면 실력 향상에 많은 도움이 될 것 같기도 하다.
아주 시간을 쏟진 않고, 틈틈히 봐야겠다.
from http://soongjamm.tistory.com/160 by ccl(A) rewrite - 2021-12-27 03:02:05