[질문] 스프링 배치 ItemReader 무한 반복 관련하여 질문 드립니다.

2017-03-17 13:45

안녕하세요 회사에서 스프링배치를 사용하여 배치성 프로그램 작성할 일이 있어 관련하여 공부중에 있는데요 (정확히는 스프링 부트 배치를 사용하고 있습니다.)

한가지 궁금한 부분은 제가 알기로는 스프링 배치는 각 Job별로 Step을 등록해서 Step은 reader, processor, writer로 구성할 수 있구요 해당 잡을 한번 실행하면 종료되는 것으로 알고 있는데요.

ItemReader쪽에서 null 을 리턴하기 전까지는 해당 Job의 Step이 계속 반복되는 이슈가 있더라고요. 문서를 찾아보니 Reader를 멈추고 싶으면 null을 리턴하라고 되어있는데.. 왜 이렇게 되는건지 제가 이해한게 맞는건지 질문 드립니다.

문서 링크 (검색한 문서에서는 Reads a piece of input data and advance to the next one. Implementations must return null at the end of the input data set. In a transactional setting, caller might get the same item twice from successive calls (or otherwise), if the first call was in a transaction that rolled back. 이런 내용이 있었습니다.)

@Component
@StepScope
public class Step1Reader implements ItemReader<String> {

    private int cnt = 0;

    @Override
    public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        cnt++;
        System.out.println("Call Cnt = " + cnt);

        // 더 이상 읽어올 Item이 없을 때에는 read()메소드에서 null값을 반환. 그 전까지는 순차적인 값을 리턴
        //return cnt == 2 ? null : "Reader";
        return "Reader";
    }
}

리더 코드는 위와 같이 작성한 상태입니다.

해당 코드 git 주소는 아래와 같습니다! 깃주소

2개의 의견 from SLiPP

2017-03-17 16:47

맞게 이해한 것으로 알고 있어요. 저도 워낙 오래 전에 spring batch를 사용했기 때문에 기억이 가물가물 한데요. 제가 기억하기로는 그런 것으로 알고 있어요.

하나의 job이 한 번 실행될 때 해당 job에 해당하는 모든 item을 읽어와 하나씩 처리하고 완료하면 job이 끝나겠죠. 이런 맥락에서 처리할 item의 마지막임을 표시하기 위해 null을 return하는 것으로 알고 있어요.

이를 잘못 이해하고 구현할 경우 무한 루프에 빠지게 되죠. 처음에 이 부분이 다소 생소해서 문제가 발생할 가능성이 많기 때문에 제대로 이해하고 사용해야 합니다.

spring batch가 좋은 라이브러리이기는 한데 복잡도가 좀 높아서 학습하는데 시간이 좀 걸릴 겁니다.

의견 추가하기