강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

stonesnail1님의 프로필 이미지
stonesnail1

작성한 질문수

ItemReaderAdapter 질문

작성

·

36

·

수정됨

0

수업을 듣고 ItemReaderAdapter를 사용해봤는데 service의 리턴값이 List<객체> 인 경우에는 데이터를 못 불러오더라구요 어떻게 해야될까요

 

또 iterator를 사용해봤는데 iterator가 초기화가 안되더라구요,,

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
stonesnail1님, 질문해주셔서 감사합니다.

ItemReaderAdapter를 사용할 때, service의 리턴값이 List<객체> 형태라면 각 데이터를 순차적으로 처리할 수 있도록 설정이 필요합니다. 일반적으로 ItemReader는 데이터를 하나씩 반환해야 하므로, List를 반환받을 경우에는 이를 한 개씩 가져오는 로직으로 변환해야 합니다.

만약 iterator 초기화 문제를 겪고 있으면, 다음과 같은 방법으로 문제를 해결할 수 있습니다:
- ItemReaderAdapter에서 List를 리턴받고, 이를 iterator와 연동하여 한 개씩 반환하는 ItemReader를 구현합니다.
- 서비스 호출 시 List를 반환하고, 반환된 리스트를 기반으로 하는 Iterator를 생성합니다. 이후, 이 Iterator를 매 번 호출 시 하나의 객체만 제공하게 설정해 보세요.

아래는 ItemReaderAdapter를 활용한 구현 예시입니다:

public class CustomItemReader implements ItemReader<MyObject> {

    private Iterator<MyObject> iterator;

    @Autowired
    public CustomItemReader(MyService myService) {
        List<MyObject> items = myService.getItems(); // service 호출
        this.iterator = items.iterator(); // 리스트를 iterator로 변환
    }

    @Override
    public MyObject read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        if (iterator != null && iterator.hasNext()) {
            return iterator.next();
        }
        return null; // 데이터가 더 이상 없으면 null 반환
    }
}

이 방법은 ItemReaderAdapter 대신 직접적인 ItemReader 구현체를 작성하여 문제를 해결하는 예시입니다. 상황에 따라 다르게 적용해야 할 수 있으니, 프로젝트에 적절히 맞춰 사용해 보시길 바랍니다.

추가로 더 복잡한 환경이거나 다른 설정이 필요하다면, Spring Batch 문서를 참조하여 심화된 내용을 학습해 보는 것도 좋은 방법입니다.

도움이 되셨길 바랍니다! 추가 질문이 있으시면 언제든지 말씀해 주세요.

stonesnail1님의 프로필 이미지
stonesnail1

작성한 질문수

질문하기