• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Chunk 방식에 관하여 질문드립니다!

22.11.30 11:29 작성 조회수 253

0

안녕하세요. SpringBatch Chunk 관련해서 궁금한점이 생겨서 질문드립니다!

보통 하나의 Step에 ItemReader,ItemProcessor,ItemWriter가 1:1:1 구조로 설계되는걸 코드로 보았습니다.
만약에 Chunk 기능은 그대로 사용하고 싶으면서, ItemReader는 2번, ItemProcessor,ItemWrite는 1번씩만 구현하고 싶다면 어떤 방법이 좋을까요?
(ItemReader에서 각각 List 데이터를 읽어온다음에, Process에서 가공하고, ItemWriter에 chunk단위로 가공한 데이터를 insert 하고 싶음을 의미합니다)

강의 잘 듣고 있습니다. 날이 추우신데 건강 조심하세요!

답변 1

답변을 작성해보세요.

0

chunk 프로세스는 이렇게 진행됩니다.

 

  1. ItemReader 에서 총 5개의 데이터를 읽어와서 chunk 에 담음, 즉 청크사이즈가 5 임
    - chunk 내부에 list 속성이 있는데 여기에 5개의 데이터가 있음

  2. ItemProcessor 는 ItemReader 에서 생성한 chunk 를 그대로 전달받음
    - chunk 에는 5개의 데이터가 존재하고 이 데이터를 for 구문으로 반복하면서 데이터를 한개씩 가공처리함
    - chunk 를 새롭게 생성하고 가공한 데이터를 하나씩 담음. 총 5개의 가공된 데이터가 chunk 에 저장됨

  3. ItemWriter 는 ItemProcessor 에서 생성한 chunk 내부의 list 를 전달받음
    - list 에는 5개의 데이터가 존재하고 이를 일괄처리함

 

ItemReader 에서 1건 읽고 바로 ItemProcessor 로 전달되는 것이 아닙니다.
즉 ItemReader 는 ItemProcessor 에게 chunk 객체 자체를 전달하고 ItemProcessor 는 ItemWriter 에게 chunk 안의 list 객체가 전달됩니다.
이 개념을 바탕으로 어떻게 구현이 가능한지 다시 한번 생각해 보시기 바랍니다.


그리고 제가 질문의 의미를 정확하게 이해하지 못해서 그러는데 조금더 자세히 설명 부탁드립니다.

hong8159님의 프로필

hong8159

질문자

2022.12.05

안녕하세요. 주신 답변 잘 읽었습니다.
제가 질문을 명확하게 못 드린거 같아서 좀 더 자세하게 설명하고자 합니다.

일반적으로 ItemReader에서 한 리스트만 읽어오고, 그 읽어온 리스트를 기반으로
ItemProcessor, ItemWriter 처리를 합니다.

제가 의문인 점은 ItemReader에서 2개의 리스트를 읽어와 ItemProcessor , ItemWriter 처리가 가능한지 궁금합니다.
( A,B 라는 리스트를 조회 해서 하나의 ItemProcessor에서 가공 후 ItemWriter 에 처리하는 방식)
(ItemProcessor 에서 2개의 리스트를 읽어와야 하는경우 [데이터 가공을 위해])

@Bean("batchTest")

public Step batchTest() {

return stepBuilderFactory.get("batchTest")

.<Test, Test>chunk(CUNK_SIZE)

.reader(리스트1))

.readet(리스트2))

.processor(리스트1,리스트2 [가공])

.writer(리스트1,리스트2 가공데이터 insert)

.build();

}

코드로 표현한다면 이렇게 될꺼 같습니다.

 



스프링 배치는 chunk 단위로 데이터를 읽어오도록 되어 있고 chuk 안에 하나의 list 가 존재합니다.

그리고 chunkSize 가 채워지면 바로 ItemProcessor 에게 넘어가도록 되어 있습니다.

그리고 API 구조상 두개의 reader() 를 동시에 수행할 수 없습니다.

위와 같이 구현하는 것이 불가능하지는 않을 것 같지만 그렇게 하기 위해서는 ChunkProvider 와 ChunkProcessor 인터페이스를 직접 구현하거나 이미 존재하는 기본 구현체를 상속받아 오버라이딩 하는 식으로 구현해야 할 것 같습니다.

혹 더 쉬운 방법이 있을지는 모르겠지만 현재로서는 아키텍처나 설계 자체를 손봐야 할 정도인 것 같습니다.

저도 해결방안에 대해 고민해 보도록 하겠습니다.