• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

43:07 skip 질문입니다.

22.12.04 21:16 작성 22.12.05 00:25 수정 조회수 275

0

ItemWriter에서 '12' 아이템이 예외가 터져서 Skip처리 되고, 다시 ItemReader 부터 재실행 되는 것은 이해했습니다.

근데 ItemProcessor에서 '6'과 '7' 을 Skip처리한 거처럼
ItemWriter역시 마찬가지로 ExecutionContext에 '12' 아이템이 저장되므로 ItemProcessor와 ItemWriter에서 '12' 아이템은 Skip 해야 되지 않나요?
그러면 출력값에 6, -6과 7, -7이 안뜬거 처럼
12, -12는 안떠야 된다고 생각합니다.

 

답변 1

답변을 작성해보세요.

0

프로세스는 말씀하신 것처럼 흐르고 있습니다.

다만 ItemWriter 에서 예외가 발생해서 처리되는 skip 동작은 ItemReader 나 ItemProcessor 와는 약간 다르게 동작합니다.

코드를 보시면 ItemWriter 에서 -12 값을 처리할 때 예외가 발생해서 처리하지 못합니다
이 때 ItemWriter 에서 ItemWriter : -12 가 출력되었습니다.

그러면 skip 기능이 동작해서 ItemProcessor 로 가는데 ItemProcessor 는 자신이 가지고 있는 outputs 에서 다시 시작합니다. 즉 {12,13,14,15,16} 에서 시작합니다.
이 때 ItemProcessor : 12 가 출력되었습니다.

그리고 ItemWriter 에게 {-12,-13,-14,-15,-16} 를 다시 던저 주게 됩니다.
그러면 ItemWriter 에서 -12 를 처리해야 하기 때문에 다시 예외를 발생하게 됩니다.
이 때 ItemWriter 에서 ItemWriter : -12 가 출력되었습니다.

이후부터는 ItemProcessor 에서 12 를 스킵하고 {13,14,15,16} 을 가지고 다시 시작하게 됩니다
그러면 12 는 제외가 되기 때문에 ItemWriter 에서 예외가 발생하지 않고 정상적으로 실행이 됩니다.

이 흐름을 본다면 ItemWriter 에서 예외가 발생해서 스킵 기능이 동작하게 된다면 실제 데이터를 다시 리셋해서 전달하는 쪽은 ItemProcessor 이기 때문에 ItemWriter 에서는 단지 ItemProcessor 에서 전달하는 데이터를 다시 받게 되는 상황이 발생해서 마치 두번 실행되는 것처럼 여겨 질수 있는데 이는 스프링 배치에서 정해놓은 규칙에 불과합니다.
예외는 ItemWriter 에서 발생해서 skip 기능이 동작했지만 실제 데이터를 skip 하는 것은 ItemProcessor 에서 하게 되고 ItemWriter 는 전달받은 데이터를 처리하는 역할만 하게 됩니다.

핵심은 ItemWriter 에서 최종적으로 -12 가 저장되지 않는 것이 중요하고 실제로 그렇게 처리가 되고 있습니다
콘솔에 출력되는 것은 흐름에 따른 과정일 뿐 결과론적으로는 스킵기능이 정상적으로 동작하고 있습니다
디버깅 하면서 찬찬히 따라가 보시면 더 이해가 되실 거라 봅니다.