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

abc9023님의 프로필 이미지
abc9023

작성한 질문수

스프링 배치

ItemReader와 ItemProcessor에서 개수가 상이할때는 어떻게 처리하는게 좋은건가요?

해결된 질문

작성

·

545

0

안녕하세요 강사님 스프링 시큐리티 강의도 듣고 좋아서 이번강의도 듣고 있는데

예제 강의에 보면 API를 호출하는 부분에서 ItemWriter로 넘어갈때 return(output) 값이  List형태일 경우에

어떻게하는게 좋은건지 질문드립니다.


예를 들어 Reader에서 넘어온 item으로 API를 호출했을때 데이터가 하나가 아닌 여러개의 응답을 받을 경우에는

Writer에서 List<List<Object>> 형태로 받을 수 밖에 없는 걸까요? 이경우에는 chunk size의 의미가

의미가 조금 없어지는 것 같아서 더 좋은 방법이 있는지 잘모르겠어서 질문드립니다~

감사합니다.

답변 1

1

정수원님의 프로필 이미지
정수원
지식공유자

ItemReader 는 한개의 item 을 읽어서 chunkSize 만큼 Chunk<I> 에 담고 이것을 ItemProcessor 로 보내고 ItemProcessor 는 Chunk<I> 를 전달받아 가공처리한 최종 Item 을 Chunk<O> 에 담고 이것을 ItemWriter 에게 전달합니다.

이때 O 는 List 타입이 됩니다.

만약 ItemProcessor 에서 item 을 List 형식으로 변환한다음 Chunk<O> 에 담는다면 Chunk<O> 는 Chunk<List<<List<O>> 가  될 것입니다.

근데 잘 생각해 보면 chunkSize 는 ItemReader 에서 기준을 삼아 결정하는 갯수입니다.

chunkSize 가 3 이라면 ItemReader 에서 3개의 item 을 읽고 ItemProcessor 에게 전달하는 개념이지 ItemProcessor 와 ItemWriter 에서는 chunkSize 에 관여하지 않습니다.

그래서 ItemProcessor 에서 3개의 Item 을 받아서 List 형식을 변환한다든지 다른 타입으로 변환해서 ItemWriter 에 전달하더라도 chunkSize 와는 별개의 문제입니다.

Chunk<O> 의 타입을 최종 변환 및 반영하는 것은 ItemProcessor 이고 ItemProcessor 는 단지 ItemReader 로 부터 chunkSize 만큼의 item 을 받을 뿐입니다.

다만 ItemWriter 에서 List<List<Object>>을 받을 경우에는 ItemWriter 에서 List<List<Object>> 를 이중으로 반복하면서 List 안에 있는 Object 를 추출하는 방식으로 할 수 있을 것입니다.

이 부분은 ItemReader, ItemProcessor, ItemWriter 의 각 특징과 역할에 따른 로직을 어떻게 구성해야 하는지는 개발자의 몫이라 생각합니다.

그리고 chunkSize, Chunk<I>, Chunk<O> 개념들을 정확하게 파악하는 것도 중요할 것이구요

답변이 되셨는지 모르겠습니다.

 

abc9023님의 프로필 이미지
abc9023

작성한 질문수

질문하기