개발/고민과 생각

spring batch 에서 하나의 reader 에 여러 개의 datasource?

hojak99 2021. 7. 1. 22:18

정산 작업이 존재한다. 사용자가 특정 페이지에서 머물고 있는 시간을 기준으로 하여 특정 시간이 넘어간다면 정산 대상이 되며, 한 번 정산이 된 사용자에게는 다시 정산이 되지 않도록 한다.

 

쉽게보자


쉽게 생각하면 위와 같이 구성 돼 있다. 하루에 한 번씩 배치에서는 A DB 에서 사용자가 페이지를 머무른 기록이 존재하는 테이블에서 데이터를 가져와 B DB 에서 정산 기록 테이블에서 정산 유무를 파악하여 이번 달에 정산이 되야 할 사용자인지 아닌지 판별해야 한다.

그러면 spring batch 에 step 이라는 개념이 존재하는데 해당 step 을 tasklet 으로 구현을 할지 reader, processor, writer 로 구현할지 고민이 되었다. 우선 처음에 생각했던 정산이라는 job 에 대한 작업은 다음과 같이 진행하려고 했다.

  1. 하루동안 사용자 별로 머무른 기록을 가져온다.
  2. 하루동안 읽은 사용자들 별로 정산 기록 테이블에서 데이터를 가져와 총 얼마를 머물렀는지, 정산 유무를 가져온다.
  3. 1과 2에서 조회한 데이터를 기준으로 하여 머무른 총 시간, 정산 유무를 결정한다.
  4. 3에서 얻은 데이터를 B DB 에 있는 정산 기록 테이블에 저장한다.

그렇다면 이제 플로우들을 다시 reader, processor, writer 로 구분을 해보자.

1, 2 -> reader
3 -> processor
4 -> writer

명확하게 각 플로우들이 reader, processor, writer 로 구분되기에 나는 tasklet 을 사용하지 않고 구현을 하려고 했다.


 

내가 막혔던 부분은 step 에는 하나의 reader 만을 가지고 있다고 알고 있는데, 이 때 아래 사진과 같이 하나의 reader 에서는 하나의 datasource 만을 가질 수 있도록 돼 있다(우선 JdbcCursorItemReaderBuilder 를 예로 들겠다). 

docs

 


그렇다면 난 A DB, B DB 의 datasource 를 이용해야 하는데 대체 어떻게 구현하라는 것이지? 라는 생각으로 삽질을 계속
했다. JdbcCursorItemReader 를 이용하려고 했는데 만약 하나 reader 에서 각기 다른 DB 에서 select 를 하게 된다면 이 cursor 의 기준을 잡을 수 없게 되므로 직접 ItemReader 를 구현하지 않는 이상 불가능하지 않을까라고 판단했다. 물론 JdbcPagingItemReader 도 마찬가지다. 

그렇게 계속 multiple reader,, composite reader 등을 키워드로 검색을 해도 아 이거다! 하는 글들이 없었다. 결국 직접 ItemReader 를 구현하거나 tasklet 으로 구현하는게 맞을 것 같다는 생각이 들게 되었고 어떻게 구현을 할까 하는 중에 지금 겪고 있는 문제 말고도 다른 삽질을 하다가 결국 내가 정한 일정에 개발을 맞출 수 없을 것 같다는 생각이 들어 tasklet 으로 구현을 했다. spring batch 를 이용하는 것도 처음이고 만약 하나의 datasource 를 가지고 배치를 돌린다면 reader, processor, writer 로 구현을 했을 것 같다만 그것도 아니니 시간을 너무 오래 끌었었다. 

이번 배포가 끝난 뒤에 실서버에서 잘 작동하면 한 동안 또 배치 코드를 손 볼 수 없을테니 다음 배치에 관련된 요구사항이 생기거나 기존 배치들을 spring batch 로 옮기는 작업을 할 때 다시 구현을 해보던가 할 것 같다.

반응형