작성
·
177
·
수정됨
0
스프링 배치를 공부 중에 궁금한 점이 있어서 질문을 남기게 됐습니다.
chunk란 여러 아이템을 묶은 덩어리 블록을 의미.
chunkSize를 100으로 했을 경우
제가 OPEN API로부터 데이터를 한번에 10개씩 읽어오도록 ItemReader를 설정했다면 (한 페이지에 10개의 데이터를 가져오도록 함) 그렇다면 동작 과정이
ItemReader를 10개씩 10번 돌고, 이후에 ItemWriter로 이동하는 것인가요
아니면 ItemReader, ItemProcessor, ItemWriter를 거치는 이 과정을 10번 하는 것인가요 ?
chunk 단위로 트랜잭션을 처리한다고 이해했는데 위 과정에서 ItemWriter는 그럼 chunk단위로 10개씩 10번 모두 읽어온 이후에 처리해야 한다고 생각하는데
어떻게 동작하는지 궁금합니다.
또한 궁금한 것이 pageSize와 chunkSize를 동일시 하는 것이 성능에 좋다고 봤습니다.
그렇다면 ItemReader에서 제가 만약 10개를 읽어온다면 chunkSize역시 10으로 하는게 좋다는 건가요 ?
- 위와 동일하게 item을 10번 read하고 ItemWriter로 이동하는지 (ItemReader - ItemWriter)를 10번하고 하나의 트랜잭션에서 ItemWriter에서 동작하는 내용을 처리하는지 궁금합니다..
부족한 질문이라 죄송합니다 ㅠㅠ
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
백엔드공부화이팅님의 스프링 배치와 관련된 질문에 대해 답변드리겠습니다.
스프링 배치의 청크 지향 처리 방식에서 청크 사이즈는 한 번에 처리할 아이템의 덩어리 크기를 의미합니다. 청크 사이즈가 100이라고 할 때, ItemReader가 API로부터 데이터를 한 번에 10개씩 읽는다면, 청크 처리 과정은 다음과 같습니다.
ItemReader에서 아이템을 10개씩 읽어서 ItemProcessor를 거친 후, 누적된 아이템이 청크 사이즈에 도달하면, 그 때 ItemWriter에 전달되어 집적 처리됩니다. 즉, ItemReader와 ItemProcessor를 거쳐 누적된 아이템이 청크 사이즈인 100개에 도달하면, 그때 한 번에 ItemWriter로 이동하여 처리됩니다. 이 과정을 10번 반복하여 총 1000개의 아이템을 처리하게 됩니다. 이러한 과정에서 각 청크 처리는 별도의 트랜잭션 범위에서 처리되어, 데이터의 일관성을 보장합니다.
페이지 사이즈와 청크 사이즈를 동일하게 설정하는 것이 성능에 좋다고 얘기하는 것은 API 호출과 같이 데이터를 페이징하여 가져올 때, 페이징 단위와 배치 처리 단위를 일치시켜 불필요한 메모리 사용량을 줄이고, 트랜잭션 범위를 효율적으로 관리하기 위함입니다. 따라서, ItemReader에서 10개씩 읽어온다면, 청크 사이즈 역시 10으로 설정하는 것이 좋을 수 있습니다. 하지만, 실제 최적의 성능을 위한 사이즈는 애플리케이션의 요구사항과 환경에 따라 달라질 수 있으므로, 여러 설정을 실험해보는 것이 좋습니다.
추가적으로 스프링 배치와 관련된 더 많은 정보는 공식 문서를 참고하시는 것을 추천드립니다.
질문에 충분히 답변되었기를 바랍니다. 다른 궁금증이 있으시다면 언제든지 질문해주세요.